比较器 class 显示错误排序
Comparator class displays wrong sorting
我有一个用 DMatch 对象填充的列表,该对象包含属性 "distance"。
我想做的是根据 "distance".
对列表进行升序或降序排序
在下面的代码中,我使用了比较器 class 并按顺序对列表进行了排序,但是索引 (8, 9,10, 11) 的输出没有很好地排序。
请让我知道我做错了什么以及如何解决这个错误
代码:
Collections.sort(list_RawMatchesMatDMatch, ascOrder);
for (int i = 0; i < list_RawMatchesMatDMatch.size(); i++) {
Log.D(TAG, "main", "rawMatDMatchLiat(" + i + ").distance: " + list_RawMatchesMatDMatch.get(i).distance);
}
static Comparator<DMatch> ascOrder = new Comparator<DMatch>() {
public int compare(DMatch arg0, DMatch arg1) {
// TODO Auto-generated method stub
return (int) (arg1.distance - arg0.distance);
}
};
输出:
Debug: MainClass -> main: rawMatDMatchLiat(0).distance: 454.26645
Debug: MainClass -> main: rawMatDMatchLiat(1).distance: 447.3835
Debug: MainClass -> main: rawMatDMatchLiat(2).distance: 442.294
Debug: MainClass -> main: rawMatDMatchLiat(3).distance: 438.98862
Debug: MainClass -> main: rawMatDMatchLiat(4).distance: 433.11084
Debug: MainClass -> main: rawMatDMatchLiat(5).distance: 427.35114
Debug: MainClass -> main: rawMatDMatchLiat(6).distance: 426.2335
Debug: MainClass -> main: rawMatDMatchLiat(7).distance: 425.16232
Debug: MainClass -> main: rawMatDMatchLiat(8).distance: 423.816
Debug: MainClass -> main: rawMatDMatchLiat(9).distance: 423.6815
Debug: MainClass -> main: rawMatDMatchLiat(10).distance: 424.51855
Debug: MainClass -> main: rawMatDMatchLiat(11).distance: 424.66693
Debug: MainClass -> main: rawMatDMatchLiat(12).distance: 423.53986
Debug: MainClass -> main: rawMatDMatchLiat(13).distance: 423.79712
Debug: MainClass -> main: rawMatDMatchLiat(14).distance: 423.62012
Debug: MainClass -> main: rawMatDMatchLiat(15).distance: 421.72028
Debug: MainClass -> main: rawMatDMatchLiat(16).distance: 419.46274
Debug: MainClass -> main: rawMatDMatchLiat(17).distance: 418.12198
这不行:
return (int) (arg1.distance - arg0.distance);
因为 int 转换会截断结果。相反:
if (arg1.distance > arg0.distance) {
return 1;
} else if (arg1.distance < arg0.distance) {
return -1;
} else {
return 0;
}
或更好:
return Double.compare(arg1.distance, arg0.distance);
我有一个用 DMatch 对象填充的列表,该对象包含属性 "distance"。
我想做的是根据 "distance".
对列表进行升序或降序排序在下面的代码中,我使用了比较器 class 并按顺序对列表进行了排序,但是索引 (8, 9,10, 11) 的输出没有很好地排序。
请让我知道我做错了什么以及如何解决这个错误
代码:
Collections.sort(list_RawMatchesMatDMatch, ascOrder);
for (int i = 0; i < list_RawMatchesMatDMatch.size(); i++) {
Log.D(TAG, "main", "rawMatDMatchLiat(" + i + ").distance: " + list_RawMatchesMatDMatch.get(i).distance);
}
static Comparator<DMatch> ascOrder = new Comparator<DMatch>() {
public int compare(DMatch arg0, DMatch arg1) {
// TODO Auto-generated method stub
return (int) (arg1.distance - arg0.distance);
}
};
输出:
Debug: MainClass -> main: rawMatDMatchLiat(0).distance: 454.26645
Debug: MainClass -> main: rawMatDMatchLiat(1).distance: 447.3835
Debug: MainClass -> main: rawMatDMatchLiat(2).distance: 442.294
Debug: MainClass -> main: rawMatDMatchLiat(3).distance: 438.98862
Debug: MainClass -> main: rawMatDMatchLiat(4).distance: 433.11084
Debug: MainClass -> main: rawMatDMatchLiat(5).distance: 427.35114
Debug: MainClass -> main: rawMatDMatchLiat(6).distance: 426.2335
Debug: MainClass -> main: rawMatDMatchLiat(7).distance: 425.16232
Debug: MainClass -> main: rawMatDMatchLiat(8).distance: 423.816
Debug: MainClass -> main: rawMatDMatchLiat(9).distance: 423.6815
Debug: MainClass -> main: rawMatDMatchLiat(10).distance: 424.51855
Debug: MainClass -> main: rawMatDMatchLiat(11).distance: 424.66693
Debug: MainClass -> main: rawMatDMatchLiat(12).distance: 423.53986
Debug: MainClass -> main: rawMatDMatchLiat(13).distance: 423.79712
Debug: MainClass -> main: rawMatDMatchLiat(14).distance: 423.62012
Debug: MainClass -> main: rawMatDMatchLiat(15).distance: 421.72028
Debug: MainClass -> main: rawMatDMatchLiat(16).distance: 419.46274
Debug: MainClass -> main: rawMatDMatchLiat(17).distance: 418.12198
这不行:
return (int) (arg1.distance - arg0.distance);
因为 int 转换会截断结果。相反:
if (arg1.distance > arg0.distance) {
return 1;
} else if (arg1.distance < arg0.distance) {
return -1;
} else {
return 0;
}
或更好:
return Double.compare(arg1.distance, arg0.distance);