我有一个这样的数组:
UserID |ItemID | Score
1 10 2.0
1 11 1.2
1 12 1.4
..........
我想根据得分列对数组进行排序。我的代码是:
double[][] arr=new double [1000][3];
int i=0;int j=0;int k=0;
while ((phrase = br.readLine()) != null) {
String[] splited =phrase.split("\t");
arr[i][0]=Double.parseDouble(splited[0]);
i++;
arr[j][1]=Double.parseDouble(splited[1]);
j++;
arr[k][2]=Double.parseDouble(splited[2]);
k++;
}
//print(a);
System.out.println();
Arrays.sort(arr, new java.util.Comparator<double[]>() {
public int compare(double[] a, double[] b) {
return (int)(a[1] -b[1]);
}
});
print(arr);
但它不起作用!怎么了?
答案 0 :(得分:2)
如果要按 last 列排序,则必须比较第二维中的 last 索引,即2.因此,您应该{{1}而不是return (int)(a[2] -b[2]);
。
顺便说一下,您为什么使用3个索引return (int)(a[1] -b[1]);
,i
和j
?你为什么不只使用一个,例如k
?
编辑:
重新考虑比较,你不应该使用i
,而应该使用@Prashant Bhate建议的(int)(a[2] -b[2])
。
原因是如果两个值之间的差异小于1或大于-1,则转换为Double.compare(a[2], b[2])
将导致0,这意味着两者都相等。示例:int
。
答案 1 :(得分:2)
如果需要按第三列排序,则需要使用a[2]
。
public static void main(String[] args) {
double[][] arr = { { 1, 10, 2.0 }, { 1, 11, 1.2 }, { 1, 12, 1.4 }, };
;
Arrays.sort(arr, new Comparator<double[]>() {
public int compare(double[] o1, double[] o2) {
return Double.compare(o1[2], o2[2]);
}
});
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[i][j]);
System.out.print("\t");
}
System.out.println();
}
}
答案 2 :(得分:1)
这是因为得分列是表格的第3列 - 您在第二列上排序 - 即
Arrays.sort(arr, new java.util.Comparator<double[]>() {
public int compare(double[] a, double[] b) {
return (int)(a[2] - b[2]);
}