排序列表 <> 未按预期工作

Sort List<> not working as expected

如何在 java a-z 中或按 日期 或 [=24 中的任何内容排序 List<> =]大到低或低到大等等?

我对此进行了很多搜索,发现 Collections 仅从 a-z 排序,但它是先排序大写字母再排序小写字母

例如:

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

现有答案的补充。

"first convert to lowercase then compare" 进行忽略大小写比较的方法无效,因为不必要地创建了新的 String 对象。

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

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

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