我想按其特定列值对二维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]
比较值,并且在值相等时没有条件。
您需要修改您的比较器
来处理该索引检查,如下所示:
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;
}
不建议,如果你正在寻找一个快速算法。