对双数组进行排序
Sorting a double array
这是我的未排序数组:
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]);
}
});
您需要进一步指定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);
}
});
首先,您将 int
数组存储在另一个数组中,大概是在 int[][]
中。您正试图在内部数组的 3 个元素之间强制建立关系。在像Java这样的面向对象的语言中,最好定义一个class将3个值存储在一起,然后创建一个一维数组来存储对象。
public class My3Values {
private int p, b, a;
// Constructor(s), getters go here
}
(不一定要叫My3Values
,只是举例。)
然后您可以将 Comparator
class 定义为 Comparator<My3Values>
.
其次,您目前忽略了对您来说有意义的 B
值。如果 A
值相同,请添加考虑 B
值的代码。
int comp = Integer.compare(o1.getA(), o2.getA());
if (comp == 0)
{
comp = Integer.compare(o1.getB(), o2.getB());
}
return comp;
您需要处理比较第二行的情况 return 0
(相等的值),在这种情况下 return 比较第一列的值的结果。
因此您的代码可能会执行如下操作:
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]));
这是我的未排序数组:
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]);
}
});
您需要进一步指定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);
}
});
首先,您将 int
数组存储在另一个数组中,大概是在 int[][]
中。您正试图在内部数组的 3 个元素之间强制建立关系。在像Java这样的面向对象的语言中,最好定义一个class将3个值存储在一起,然后创建一个一维数组来存储对象。
public class My3Values {
private int p, b, a;
// Constructor(s), getters go here
}
(不一定要叫My3Values
,只是举例。)
然后您可以将 Comparator
class 定义为 Comparator<My3Values>
.
其次,您目前忽略了对您来说有意义的 B
值。如果 A
值相同,请添加考虑 B
值的代码。
int comp = Integer.compare(o1.getA(), o2.getA());
if (comp == 0)
{
comp = Integer.compare(o1.getB(), o2.getB());
}
return comp;
您需要处理比较第二行的情况 return 0
(相等的值),在这种情况下 return 比较第一列的值的结果。
因此您的代码可能会执行如下操作:
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]));