整数数组列表的排序列表不取决于其在Java中的长度

时间:2018-10-09 21:22:41

标签: java

我要对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
有人可以帮我解决吗?

2 个答案:

答案 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)

您可以分两个步骤进行操作:

  1. 借助forEach(Collections::sort)方法将数组从最小值到最大值排序。

  2. 比较数组并按特定顺序排列它们。

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]]