使用 Java 中的已排序数组对 ArrayList 进行排序最终得到不同的结果

Sorting ArrayList with sorted Array in Java Ends Up with Different Results

我想按 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]

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

我想我需要了解比较器 class.. 谁能解释一下?

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

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

或者您可以创建一个 class Pair 的列表,其中字符串字段的值是您的原始列表所包含的字符串,而 int 字段的值是相应字符串的索引值。在这种情况下,您可以使用比较器对对列表进行排序,然后通过遍历已排序的对列表来获得已排序的字符串列表