使用 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 字段的值是相应字符串的索引值。在这种情况下,您可以使用比较器对对列表进行排序,然后通过遍历已排序的对列表来获得已排序的字符串列表
我想按 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 字段的值是相应字符串的索引值。在这种情况下,您可以使用比较器对对列表进行排序,然后通过遍历已排序的对列表来获得已排序的字符串列表