这是我未分类的数组:
P B A
5 125 400
2 102 145
3 56 200
6 65 200
7 30 200
4 148 300
1 135 0
这是我的当前数组在我对其进行排序之后的结果,这是我得到的输出
P B A
1 135 0
2 102 145
3 56 200
6 65 200
7 30 200
4 148 300
5 125 400
我希望输出看起来像这样
P B A
1 135 0
2 102 145
7 30 200
3 56 200
6 65 200
4 148 300
5 125 400
这是我目前的代码
Arrays.sort(myArr, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[2], o2[2]);
}
});
答案 0 :(得分:2)
您需要进一步指定Comparator
。目前,您只是按第3个元素对数组进行排序。
Arrays.sort(myArr, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
int ret = Integer.compare(o1[2], o2[2]);
// if the entries are equal at index 2, compare index 1
if (0 == ret) {
ret = Integer.compareTo(o1[1], o2[1]);
}
return (ret);
}
});
答案 1 :(得分:1)
首先,您将int
数组存储在另一个数组中,可能是int[][]
。您试图强制内部数组的3个元素之间的关系。在像Java这样的面向对象语言中,最好定义一个类来将3个值存储在一起,然后创建一个存储对象的一维数组。
public class My3Values {
private int p, b, a;
// Constructor(s), getters go here
}
(它不必被称为My3Values
,仅举例来说。)
然后,您可以将Comparator
课程定义为Comparator<My3Values>
。
其次,您当前忽略的B
值意味着您的排序。如果B
值相同,请添加考虑A
值的代码。
int comp = Integer.compare(o1.getA(), o2.getA());
if (comp == 0)
{
comp = Integer.compare(o1.getB(), o2.getB());
}
return comp;
答案 2 :(得分:1)
您需要处理比较第二行将返回0
(相等值)的情况,并且在这种情况下返回比较第一列的值的结果。
所以你的代码很可能会像:
Arrays.sort(myArr, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
int result = Integer.compare(o1[2], o2[2]);
if (result != 0)
return result;
else
return Integer.compare(o1[1], o2[1]);
}
});
但是,如果您可能想要比较多个列,并且如果您想轻松创建不同的订单,则应为每列创建单独的比较器。
在Java 8中,您可以重写比较器,如
Comparator<int[]> secondColumnt = new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[2], o2[2]);
}
}
将其写为
Comparator<int[]> secondColumnt = Comparator.comparingInt(row -> row[2]);
所以我们还要为第一列创建比较器
Comparator<int[]> firstColumnt = Comparator.comparingInt(row -> row[1]);
现在,从Java 8开始,我们可以使用thenComparing
方法从已有的比较器创建比较器。
因此,如果我们想创建比较器,它将首先比较第二列中的值,如果它们是第一列的相等比较器,我们可以将其写为
Comparator<int[]> secondThenFirstColumn = secondColumnt.thenComparing(firstColumnt);
所以你的最终代码看起来像
Arrays.sort(myArr, secondThenFirstColumn);
或
Arrays.sort(myArr, secondColumnt.thenComparing(firstColumnt));
或者如果您不想创建单独的预定义比较器
Arrays.sort(myArr, Comparator.<int[]>comparingInt(row -> row[2]).thenComparingInt(row -> row[2]));