提问者:小点点

如何按列值对2D ArrayList进行排序,如果值相等怎么办?


我想按其特定列值对二维ArrayList进行排序,如果两个数组的列值相等,则使用另一个列值比较两个数组。

例如:

array = [[2, 3, 4, 5][0, 2, 3, 4][0, 1, 2, 3][1, 2, 3, 4]]

我想先将它们与它们的索引[0]进行比较,但是由于数组[1][0]数组[2][0]具有相同的值0我想通过它们的索引[3]来比较这两个数组。

因此,新数组将是:

[[0, 1, 2, 3][0, 2, 3, 4][1, 2, 3, 4][2, 3, 4, 5]]

我有这个密码

public ArrayList<List<Integer>> sortArray(ArrayList<List<Integer>> spaces) {
    final Comparator<List<Integer>> comparator = new Comparator<List<Integer>>() {
        @Override
        public int compare(List<Integer> sList1, List<Integer> sList2) {
            return sList1.get(0).compareTo(sList2.get(0));
        }
    };

    Collections.sort(spaces, comparator);

    return spaces;
}

但是,这仅通过索引[0]比较值,并且在值相等时没有条件。


共3个答案

匿名用户

您需要修改您的比较器来处理该索引检查,如下所示:

public int compare(List<Integer> sList1, List<Integer> sList2) {
    if (sList1.get(0) != sList2.get(0)) {
        return sList1.get(0).compareTo(sList2.get(0));
    } else {
        return sList1.get(3).compareTo(sList2.get(3));
    }
}

但是如果你运行Java8及以上,你可以直接做这样的事情来对你的收藏进行排序:

Collections.sort(spaces, (sList1, sList2) -> {
    if (sList1.get(0) != sList2.get(0)) {
        return sList1.get(0).compareTo(sList2.get(0));
    } else {
        return sList1.get(3).compareTo(sList2.get(3));
    }
});

对于Java8,您可以做类似于您已经在做的事情:

Collections.sort(spaces, new Comparator<List<Integer>>() {
    @Override
    public int compare(List<Integer> sList1, List<Integer> sList2) {
        if (sList1.get(0) != sList2.get(0)) {
            return sList1.get(0).compareTo(sList2.get(0));
        } else {
            return sList1.get(3).compareTo(sList2.get(3));
        }
    }
});

在这两种情况下,输出都将是:

[[0, 1, 2, 3], [0, 2, 3, 4], [1, 2, 3, 4], [2, 3, 4, 5]]

匿名用户

我想你可以使用JavaCollection. List的compareTo方法(Let's abbreviate CT)。以下是CT的一些示例输出。5.CT(7)-

匿名用户

您需要比较子列表中的所有项目。例如:

public int compare(List<Integer> sList1, List<Integer> sList2) {
    for (int i = 0; i < 4; i++) {
        int c = sList1.get(i).compareTo(sList2.get(i));
        if (c != 0)
            return c;
    }
    return 0;
}

不建议,如果你正在寻找一个快速算法。