【问题标题】:Collections sort - bug in large list集合排序 - 大列表中的错误
【发布时间】:2018-05-02 21:13:24
【问题描述】:

我正在尝试按页码对对象列表进行排序(如果页面相等,则按位置),如下所示:

Collections.sort(arlToTort, new Comparator<UserDefinedLink>() {
@Override
public int compare(UserDefinedLink lhs, UserDefinedLink rhs) {
    if(lhs.getPageNum() > rhs.getPageNum()){
        return 0;
    }else {
        if(lhs.getPageNum() == rhs.getPageNum()){
            double rhsY =  getLinkYLocation(rhs.getLocationStart());
            double lhsY =  getLinkYLocation(lhs.getLocationStart());
            if(rhsY > lhsY){
                return 0;
            }else{
                return -1;
            }
        }else{
            return -1;
        }
    }
  }
});

当我设置一个小列表(少于 32 个项目)时,它可以正常工作,但是当列表多达 32 个项目时,排序不能正常工作,这是排序后的日志示例:

包含 31 项的列表:

 D/getSortedListByPageNumber: Page: 2 
 D/getSortedListByPageNumber: Page: 4
 D/getSortedListByPageNumber: Page: 4
 D/getSortedListByPageNumber: Page: 9
 D/getSortedListByPageNumber: Page: 9
 D/getSortedListByPageNumber: Page: 9
 D/getSortedListByPageNumber: Page: 9
 D/getSortedListByPageNumber: Page: 9
 D/getSortedListByPageNumber: Page: 9
 D/getSortedListByPageNumber: Page: 9
 D/getSortedListByPageNumber: Page: 10
 D/getSortedListByPageNumber: Page: 10
 D/getSortedListByPageNumber: Page: 10
 D/getSortedListByPageNumber: Page: 10
 D/getSortedListByPageNumber: Page: 10
 D/getSortedListByPageNumber: Page: 10
 D/getSortedListByPageNumber: Page: 14
 D/getSortedListByPageNumber: Page: 14
 D/getSortedListByPageNumber: Page: 20
 D/getSortedListByPageNumber: Page: 25
 D/getSortedListByPageNumber: Page: 26
 D/getSortedListByPageNumber: Page: 26
 D/getSortedListByPageNumber: Page: 28
 D/getSortedListByPageNumber: Page: 28
 D/getSortedListByPageNumber: Page: 30
 D/getSortedListByPageNumber: Page: 31
 D/getSortedListByPageNumber: Page: 34
 D/getSortedListByPageNumber: Page: 35
 D/getSortedListByPageNumber: Page: 39
 D/getSortedListByPageNumber: Page: 42
 D/getSortedListByPageNumber: Page: 44

包含 32 项的列表:

D/getSortedListByPageNumber: num of items : 32
D/getSortedListByPageNumber: Page: 4
D/getSortedListByPageNumber: Page: 4
D/getSortedListByPageNumber: Page: 9
D/getSortedListByPageNumber: Page: 9
D/getSortedListByPageNumber: Page: 9
D/getSortedListByPageNumber: Page: 9
D/getSortedListByPageNumber: Page: 9
D/getSortedListByPageNumber: Page: 9
D/getSortedListByPageNumber: Page: 26
D/getSortedListByPageNumber: Page: 26
D/getSortedListByPageNumber: Page: 28
D/getSortedListByPageNumber: Page: 28
D/getSortedListByPageNumber: Page: 30
D/getSortedListByPageNumber: Page: 34
D/getSortedListByPageNumber: Page: 39
D/getSortedListByPageNumber: Page: 44
D/getSortedListByPageNumber: Page: 2
D/getSortedListByPageNumber: Page: 9
D/getSortedListByPageNumber: Page: 9
D/getSortedListByPageNumber: Page: 10
D/getSortedListByPageNumber: Page: 10
D/getSortedListByPageNumber: Page: 10
D/getSortedListByPageNumber: Page: 10
D/getSortedListByPageNumber: Page: 10
D/getSortedListByPageNumber: Page: 10
D/getSortedListByPageNumber: Page: 14
D/getSortedListByPageNumber: Page: 14
D/getSortedListByPageNumber: Page: 20
D/getSortedListByPageNumber: Page: 25
D/getSortedListByPageNumber: Page: 31
D/getSortedListByPageNumber: Page: 35
D/getSortedListByPageNumber: Page: 42

【问题讨论】:

    标签: android sorting arraylist collections


    【解决方案1】:

    compareTo 返回时,您似乎缺少一些约束

    Returns a negative integer => object is less than
    Returns a zero => object are equals
    Returns a positive integer => object is greater than
    

    所以当对象为greater 时,它应该返回正值而不是0,后者用于equality

    所以用

    Collections.sort(arlToTort, new Comparator<UserDefinedLink>() {
            @Override
            public int compare(UserDefinedLink lhs, UserDefinedLink rhs) {
                if(lhs.getPageNum() > rhs.getPageNum()){
                    return 1;
                   //      ^ greater 
                }else {
                    // for equality 
                    if(lhs.getPageNum() == rhs.getPageNum()){
                        double rhsY =  getLinkYLocation(rhs.getLocationStart());
                        double lhsY =  getLinkYLocation(lhs.getLocationStart());
                        if(rhsY > lhsY){
                            return 1;
                        }
                        else if(rhsY == lhsY){ return 0;}
                        else{
                            return -1;
                        }
                    }else{
                        return -1;
                    }
                }
            }
        });
    

    【讨论】:

    • @gilcohen 我很高兴能帮上忙,编码愉快
    猜你喜欢
    • 2019-12-11
    • 2020-08-16
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2015-10-31
    相关资源
    最近更新 更多