繁体   English   中英

排序列表<>无法按预期工作

[英]Sort List<> not working as expected

如何在java az中List<>或按日期或从较大到较低较低到较大等的任何内容进行排序?

我搜索了很多关于这一点,并发现Collections 只从az排序,但它先是大写,然后是小写

例如:

// Must be like this
Best
best
Book
Bus

// But it's returns this
Best
Book
Bus
best

它也很慢,我看到其他应用程序在5秒内加载排序列表。 我的需要15或20秒!

编码:

Collections.sort(posts, new Comparator<Post>() {
            @Override
            public int compare(Post lhs, Post rhs) {
                return lhs.getName().compareTo(rhs.getName());
            }
        });

使用String.compareToIgnoreCase可能会更有效:

Collections.sort(posts, new Comparator<Post>() {
     @Override
     public int compare(Post lhs, Post rhs) {
         return lhs.getName().compareToIgnoreCase(rhs.getName());
     }
});

这样你就不会创建中间字符串(比如@TimBiegeleisen答案),但要就地比较它们。

请注意,它在Java-8中更简单:

Collections.sort(posts, Comparator.comparing(Post::getName, String.CASE_INSENSITIVE_ORDER));

使用String.toLowerCase()来处理单词大写的问题:

Collections.sort(posts, new Comparator<Post>() {
        @Override
        public int compare(Post lhs, Post rhs) {
            String left  = lhs.getName().toLowerCase();
            String right = rhs.getName().toLowerCase();

            if (left.equals(right)) {
                return lhs.getName().compareTo(rhs.getName());
            }
            else {
                return left.compareTo(right);
            }
});

如果您还想在排序中包含大小和日期等内容,则可以修改compare()方法以将这些内容考虑在内。 例如,要按名称(第一个)和大小(第二个)进行比较,请使用以下代码:

Collections.sort(posts, new Comparator<Post>() {
     @Override
     public int compare(Post lhs, Post rhs) {
         int nameComp = lhs.getName().compareToIgnoreCase(rhs.getName());
         if (nameComp == 0) {
             Integer lhsSize = lhs.getSize();
             Integer rhsSize = rhs.getSize();

             return lhsSize.compareTo(rhsSize);
         }
         else {
             return nameComp;
         }
     }
});

现有答案的补充。

通过“首先转换为小写然后比较”进行大小写忽略的比较的方法无效,因为不必要地创建新的String对象。

更合适的方法是使用String.compareIgnoreCase()String.CASE_INSENSITIVE_ORDER比较器。

而且,如果OP对第三方库开放,使用Guava或Apache Common Langs可能会使您的代码更容易阅读,如果您要比较多个属性,例如使用Guava:

Collections.sort(posts, new Comparator<Post>() {
    @Override
    public int compare(Post lhs, Post rhs) {
        return ComparatorChain.start()
                .compare(lhs.getName(), rhs.getName(), String.CASE_INSENSITIVE_ORDER)
                .compare(lhs.getName(), rhs.getName())
                .compare(lhs.getDate(), rhs.getDate()) 
                .compare(lhs.getId(), rhs.getId())
                .result();
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM