【问题标题】:Comparator class displays wrong sorting比较器类显示错误排序
【发布时间】:2015-06-09 23:55:08
【问题描述】:

我有一个填充了 DMatch 对象的列表,该对象包含属性“距离”。

我想做的是根据“距离”对该列表进行升序或降序排序。

在下面的代码中,我使用了 Comparator 类并按顺序对列表进行排序,但索引 (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

【问题讨论】:

    标签: java list sorting arraylist comparator


    【解决方案1】:

    这不好:

    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);
    

    【讨论】:

    • b但为什么方法“public int compare(DMatch arg0, DMatch arg1)”总是“int”,我试图让 float 但这是不可能的
    • @rmaik:我不明白你的评论——请解释一下。
    • 我的意思是方法“public int compare(DMatch arg0, DMatch arg1)”的返回ada类型是int,我不能改变它
    • @rmaik:不,你不能,但你为什么要这样做?它只能代表 3 种状态之一,并且它的签名已设置。
    • 3 个状态??我以为它们是两种状态,上升或下降!第三个是哪一个?
    猜你喜欢
    • 2014-11-21
    • 2013-08-28
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2015-06-28
    相关资源
    最近更新 更多