有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java列排序不会忽略大写字母

我的清单如下:

ArrayList<String> al = new ArrayList<String>();
al.add("James Smith");
al.add("MARIA GARCIA");
al.add("Maria Garcia");
al.add("DAVID SMITH");

我使用了集合排序,忽略了大写字母

Collections.sort(al, String.CASE_INSENSITIVE_ORDER); 

它对所有的字母都有效,但对MARIA GARCIA而言,它仍然位于较低的字母Maria Garcia之前。有办法改变吗


共 (3) 个答案

  1. # 1 楼答案

    如果两个项目相等,则不会更改订单*

    通过使用忽略大小写的比较器,这些字符串是相等的

    如果希望在两个项相等时应用不同的排序,可以使用thenComparing扩展比较器,如下所示:

    Collections.sort(al, String.CASE_INSENSITIVE_ORDER
                               .thenComparing(
                                   Comparator.comparing(String::toString)
                                             .reversed())); 
    

    在这种情况下,可以更简单地写为:

    Collections.sort(al, String.CASE_INSENSITIVE_ORDER
                               .thenComparing(Comparator.reverseOrder())); 
    

    *这就是为什么other answer可以工作,但您不想多次排序,它效率低下,读者更难理解,因为它是反向编写的,并且不是一种在所有其他情况下都可以重用的模式

  2. # 2 楼答案

    在这种情况下,可以使用比较器链,如下所示:

    ArrayList<String> list = new ArrayList<>();
    list.add("James Smith");
    list.add("MARIA GARCIA");
    list.add("Maria Garcia");
    list.add("DAVID SMITH");
    
    list.sort(String.CASE_INSENSITIVE_ORDER
            .thenComparing(Comparator.reverseOrder()));
    
    list.forEach(System.out::println);
    

    输出:

    DAVID SMITH
    James Smith
    Maria Garcia
    MARIA GARCIA
    
  3. # 3 楼答案

    更新

    感谢Holger提供了这个最简洁(IFAIK)的解决方案

    只需将^{}传递给sort方法,就可以完成这项工作

    import java.text.Collator;
    import java.util.ArrayList;
    import java.util.List;
    
    class Main {
        public static void main(String[] args) {
            List<String> al = new ArrayList<>(List.of("James Smith", "MARIA GARCIA", "Maria Garcia", "DAVID SMITH"));
            al.sort(Collator.getInstance());
            System.out.println(al);
        }
    }
    

    输出:

    [DAVID SMITH, James Smith, Maria Garcia, MARIA GARCIA]
    

    原始答案

    你可以先按相反的顺序对列表进行排序,然后按照你已经在做的方式进行排序

    演示:

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    class Main {
        public static void main(String[] args) {
            List<String> al = new ArrayList<>(List.of("James Smith", "MARIA GARCIA", "Maria Garcia", "DAVID SMITH"));
            Collections.sort(al, Comparator.reverseOrder());
            Collections.sort(al, String.CASE_INSENSITIVE_ORDER);
            System.out.println(al);
        }
    }
    

    输出:

    [DAVID SMITH, James Smith, Maria Garcia, MARIA GARCIA]