我要对Integer的Arraylist的ArrayList进行排序,并且它们的长度不同
我在这里尝试代码sort an arraylist of arraylist of integers
它是可行的,但是它的优先级是按长度顺序而不是值
例如:
2、2、2、3
2、2、3、4
2、2、90
其输出将如下所示:
2、2、90
2,2,2,3
2、2、3、4
我想要的订单:
2,2,2,3
2、2、3、4
2、2、90
有人可以帮我解决吗?
答案 0 :(得分:2)
您正在查看的代码仅比较每个列表中的第一个数字,因此它们最终的排列顺序实际上不是按大小排列的;这是任意的。
关键是这个部分
public int compare(List<Integer> o1, List<Integer> o2) {
return o1.get(0).compareTo(o2.get(0));
}
您需要类似的东西
public int compare(List<Integer> o1, List<Integer> o2) {
for (int i = 0; i < o1.size(); i++) {
if (o1.get(i).compareTo(o2.get(i)) != 0) {
return o1.get(i).compareTo(o2.get(i));
}
}
}
由于我认为这对您来说是有教益的,因此我不完整,如果我给您完整的答案,您将无能为力。我在此处编写的代码片段仅会正确比较相同长度的列表。如果第二个列表较长,则多余的值将被忽略;如果第一个列表较长,则会出错。我将其作为练习来解决这些问题。 :-)
答案 1 :(得分:0)
您可以分两个步骤进行操作:
借助forEach(Collections::sort)
方法将数组从最小值到最大值排序。
比较数组并按特定顺序排列它们。
List<List<Integer>> listOLists = Arrays.asList(
Arrays.asList(2, 90, 2),
Arrays.asList(3, 2, 4, 2),
Arrays.asList(2, 2, 3, 2));
//first step:
listOLists.forEach(Collections::sort);
//second step:
Collections.sort(listOLists, (l1, l2) -> {
for (int i = 0; i < listOLists.size(); i++) {
if (l1.get(i) != l2.get(i)) {
return l1.get(i) - l2.get(i);
}
}
return l1.get(0).compareTo(l2.get(0));
});
System.out.println(listOLists);
结果,您将得到:
[[2, 2, 2, 3], [2, 2, 3, 4], [2, 2, 90]]