java - 在 Java 中使用排序数组对 ArrayList 进行排序会得到不同的结果

标签 java arrays sorting arraylist comparator

我想按数组的 int 数字大小(从小到大)对数组进行排序,并且我想使用与数组相同的序列创建另一个 arrayList。

在本例中,我的数组是“workHour”,arrayList 是从 startHour 开始的“sortedList”。

我听从了 here 某人的建议.

我编写了如下代码。

int[] workHour = new int[]{4,2,6,2,5,4, 4, 3, 4,11, 2};
String[] startHour = new String[] {"1","3", "0", "5","3", "5", "6", "8", "8", "2","12"};

final List<String> stringListCopy = Arrays.asList(startHour);
ArrayList<String> sortedList = new ArrayList<>(stringListCopy);
Collections.sort(sortedList, (o1, o2) -> workHour[stringListCopy.indexOf(o1)] - workHour[stringListCopy.indexOf(o2)]);

Arrays.sort(workHour);
System.out.println(sortedList);

我将 String 而不是 Integer 放入 arrayList 的原因是因为得到了相同的结果,所以我切换到 String 来测试我的代码。

我得到了这样的结果:

[3, 5, 3, 5, 12, 8, 8, 1, 6, 0, 2]

不像我想象的那样:

[3, 5, 12, 8, 1, 5, 6, 8, 3, 0, 2]

但是当我像这样更改数组时:

String[] startHour = new String[] {"c1","a1","e","a2","d","c2","c3","b","c4","f","a3"};

它给了我我所期望的:

[a1, a2, a3, b, c1, c2, c3, c4, d, e, f]

我只是用一些可以更轻松地看到结果的东西更改了字符串数组,但我只是不知道是什么造成了这种差异以及为什么它会这样。

我想我需要了解 Comparator 类.. 谁能解释一下吗?

最佳答案

它适用于这种情况:{"c1","a1","e","a2","d","c2","c3","b","c4","f","a3"}因为所有元素都是唯一的。
indexOf方法返回给定元素第一次出现的索引,因为您的原始数组即 {"1","3", "0", "5","3", "5", "6", "8", "8", "2","12"}包含重复项,indexOf将为元素 "3" 返回相同的值, "5""8" (对于 "3" 均返回 1,对于 "5" 均返回 3,对于 "8" 均返回 7)

我认为你不能申请Comparator在这里,因为它使用比较元素的值,并且您的问题需要检查比较元素的索引,而不检查它们的实际值(好吧,除非您保证元素是唯一的)

或者您可以创建一个类 Pair 的列表其中 string 字段具有原始列表包含的字符串值,而 int 字段具有相应字符串的索引值。在这种情况下,您可以使用比较器对对列表进行排序,然后通过迭代对的排序列表来获取排序的字符串列表

关于java - 在 Java 中使用排序数组对 ArrayList 进行排序会得到不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55292205/

相关文章:

java - Spring AMQP : MessageListener not receiving any messages

arrays - 将更新的数组数据传递给 uipickerview

algorithm - 如何在 block 排序中对数组后缀进行排序

java - 无法启动虚拟设备错误genymotion

java - 在 Callable 中等待回调

java - 如何使用 Scanner 类中的 hasNext()?

javascript - 如何展平包含数组的对象数组?

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

sorting - 对具有公共(public)字段的不同结构进行排序的最佳解决方案

javascript - 如何按 element.name 对 javascript 对象数组进行排序