【问题标题】:Add and Sort to ArrayList at Same [duplicate]同时添加和排序到ArrayList [重复]
【发布时间】:2020-01-20 21:08:19
【问题描述】:

我正在尝试编写一种方法,该方法将随机添加项目到 ArrayList,然后根据添加的元素对其进行排序,但它无法正常工作。我在下面发布了我的代码,但我不知道为什么它不能正常工作。任何帮助将不胜感激。

public static void sortAndAdd(ArrayList<Integer> inL, int maxNumberOfElements) {

        inL.clear();
        inL.add(new java.util.Random().nextInt());
        for (int i = 1; i < maxNumberOfElements - 1; i++) {
            inL.add(new java.util.Random().nextInt(limit));
            if (inL.get(i) > inL.get(i-1)) {
                inL.set(i-1, inL.get(i));
                inL.set(i, inL.get(i-1));
            } 
        }
    }

【问题讨论】:

  • “无法正常工作”究竟是什么意思。它发生了什么?
  • 如果你想交换ab的值,你不能只写a=b; b=a;,因为这会覆盖a的值所以第二个任务不起作用。你需要写temp=a; a=b; b=temp;。它是一个标准的 swap 构造,而您没有使用它。 --- 此外,您不能在一次迭代中对数组进行排序。排序比这更复杂,程序员指南将整章都花在排序算法上。使用 Java 的内置排序方法,或开始阅读 Java 排序指南。
  • 不要在循环中创建多个Random 对象。在循环之前创建一个然后使用它。创建多个将阻止良好的随机化,所以不要这样做。 --- 不要将列表的构建与排序混为一谈。首先构建列表,然后对其进行排序。它被称为关注点分离,随着您的代码变得越来越复杂,它会变得更加有用。
  • 除了其他人所说的之外,没有理由将列表传递给您的sortAndAdd 方法,因为您会立即清除它。相反,让您的方法返回一个列表。然后在方法中声明新列表,并在完成添加和排序后返回它。
  • 另一种可能性是遍历列表,直到找到大于要插入的值。然后只需向下滑动列表的其余部分并将新的直接插入到更大的列表之前。然后继续为下一个值重复此操作。

标签: java sorting arraylist add


【解决方案1】:

即使temp 变量是固定的,您的逻辑也是有缺陷的,因为它不会排序。下面我将向您展示为什么它不起作用的示例。

让我们假设Random 将生成值110

生成的第一个值是7

[7]

下一个生成的是4

[7, 4]

它交换了它们,现在是:

[4, 7]

下一个生成的值是2

[4, 7, 2]

最终值交换,现在是:

[4, 2, 7]

如您所见,这不会正确排序 List,因为您只是比较 final 两个值,但根本不考虑前面的值。

您很可能需要在for 循环中再进行一个循环,以继续比较,直到找到正确的位置。或者完全使用不同的算法。

【讨论】:

  • You will most likely need another loop inside of the for loop to continue comparing until you find the correct place for it. 如果您假设列表在插入元素之前已排序(这是一个安全的假设,因为您从一个新列表开始,然后确保在每次插入后对其进行排序),您可以使用binary search 查找新元素的位置,然后将其插入那里。这将比循环更有效。
【解决方案2】:
            inL.set(i-1, inL.get(i));
            inL.set(i, inL.get(i-1));

你的逻辑有问题。 让我们从 i = 1 开始。您说“将位置 0 的值设置为 1 的值”,然后说“将位置 1 的值设置为 0 的值”。但是您已经用位置 1 的值覆盖了位置 0 的值。

在开始设置列表中的值之前,您需要评估变量。

如果您使用的是 Java 8,还可以查看 Stream API。

https://www.baeldung.com/java-8-streams

【讨论】:

    【解决方案3】:

    看起来你在这里覆盖了你的价值:

    inL.set(i-1, inL.get(i));
    inL.set(i, inL.get(i-1));
    

    在设置之前使用临时变量来存储值:

    int temp = inL.get(i-1);
    inL.set(i-1, inL.get(i));
    inL.set(i, temp);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 2021-11-04
      • 1970-01-01
      • 2016-08-10
      相关资源
      最近更新 更多