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

时间:2019-03-22 02:50:35

标签: java arrays sorting arraylist comparator

我想按其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类。 谁能解释一下?

1 个答案:

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