我想按其int数的大小(从小到大)对数组进行排序,并且我要使用数组的相同序列来做另一个arrayList。
在这种情况下,从startHour开始,我的数组是“ workHour”,而arrayList是“ 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]
我只是简单地更改了String数组,以便可以更容易地看到结果,而我只是不知道是什么使这种区别以及为什么它如此表现。
我想我需要了解Comparator类。 谁能解释一下?
答案 0 :(得分:1)
它适用于以下情况:{"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
的列表,其字符串字段具有原始列表所组成的字符串的值,而int字段具有相应字符串的索引的值。在这种情况下,您可以使用比较器对对列表进行排序,然后通过遍历对对的排序列表来获得对字符串进行排序的列表