我想按数组的 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/