【问题标题】:How to sort strings in java , order shoud display Capital Strings first如何在java中对字符串进行排序,顺序应首先显示Capitol Strings
【发布时间】:2019-10-13 13:13:03
【问题描述】:

需要在java中对字符串进行区分大小写的排序,但应该首先显示大写字母。

我尝试了什么:

List<String> l = Arrays.asList("aaa","AAA","AAA","aaa","BBB","ccc","CCC");
l.stream().sorted(String.CASE_INSENSITIVE_ORDER);
System.out.println(l);`

输出:

[aaa, AAA, AAA, aaa, BBB, ccc, CCC]

预期输出:

[AAA,AAA,aaa,aaa,BBB,CCC,ccc]

【问题讨论】:

  • @PaulLemarchand 更新了我的问题。需要对字符串进行排序,而不是字符。
  • 如果它有AAaaAAAaA之类的字符串怎么办?
  • 查看我的更新答案
  • @user7 然后 Aaa,AaA,aAA 应该是顺序。
  • 你的问题还不清楚。您想首先列出具有最多连续大写字母(从开头开始逐个字符比较)字符的字符串吗?那么不同长度的字符串呢,比如 [AA, AAa]

标签: java string sorting capitalize


【解决方案1】:

在比较它们后,您可以添加第二个比较器来决定排序,而忽略大小写。第二个比较器根据字符大小写排序。

List<String> l = Arrays.asList("a","A","A","a","B","c","C");
l.sort(String.CASE_INSENSITIVE_ORDER
          .thenComparing(Comparator.comparing(YourClass::isUpperCase)
             .reversed()));
    
private static boolean isUpperCase(String s) {
    return Character.isUpperCase(s.charAt(0));
}

Comparator.comparing 使用辅助方法来确定字符串是否为大写。此方法的返回类型是 boolean。布尔值的自然顺序是 false 后跟 true。因此,您必须先反转它以获取大写字符(字符串)。

注意:您应该在这里使用字符而不是字符串(如果所有字符串都只有一个字符)。这里的辅助方法只是检查这个字符串中的第一个字符,这听起来很奇怪!。

或者,如果您有检查小写的方法,您可以将其简化为

l.sort(String.CASE_INSENSITIVE_ORDER
      .thenComparing(YourClass::isLowerCase));

private static boolean isLowerCase(String s) {
    return Character.isLowerCase(s.charAt(0));
}

更新:(根据问题的 OP 更新)。

如果字符串有多个字符,如果你想根据大写字符串必须在前面的条件排序,你可以这样做。

l.sort(String.CASE_INSENSITIVE_ORDER
        .thenComparing(YourClass::areAllCharactersLowerCase));

private static boolean areAllCharactersLowerCase(String s) {
    return s.chars()
            .mapToObj(c -> (char)c)
            .allMatch(Character::isLowerCase);
}

注意:这样,CCcCcc 之类的字符串将根据第一个比较器被视为相等,而第二个比较器将为两者返回 false(再次将它们视为相等)。因此,它们的出现顺序与输入中出现的顺序相同。


编辑 2:基于 OP 评论

如果它有像​​ Aaa 或 aAA 或 AaA 这样的字符串怎么办?

@user7 那么 Aaa,AaA,aAA 应该是顺序。

我猜你的意图是通过逐个字符比较来对字符串进行排序,并且具有最多连续大写字符的字符串将被视为排在其他字符串之前。

以下代码逐字符比较并处理以下场景

  • 如果字符串a的当前字符是大写的,而字符串b的当前字符是小写的,那么字符串ab之前。
  • 如果 String a 的当前 char 是小写,而 String b 的当前 char 是大写,则 String ba 之前
  • 否则,两者的字符相同。继续搜索。

对于相等的字符串,我们在最后返回 0。

 l.sort(String.CASE_INSENSITIVE_ORDER
        .thenComparing((a, b) -> {
            //String a and b are equal when compared ignoring case (and hence same length)
            for (int i = 0; i < a.length(); i++) {
                if (Character.isUpperCase(a.charAt(i)) && Character.isLowerCase(b.charAt(i))) {
                    return -1;
                } else if (Character.isLowerCase(a.charAt(i)) && Character.isUpperCase(b.charAt(i))) {
                    return 1;
                }
            }
            return 0;
        }));

【讨论】:

    【解决方案2】:

    这是自定义排序,不是区分大小写的排序。因为在区分大小写的排序中,所有大写字母都会排在小写字母之前。因此,结果将是

    AAA > BBB > CCC > aaa > bbb > ccc
    

    要实现你的自定义排序,需要使用自定义的Comparator,如下

    import org.junit.Test;
    
    import java.util.Arrays;
    import java.util.List;
    
    public class SortCapitalFirst {
    
        @Test
        public void runTest(){
            List<String> l = Arrays.asList("aaa","AAA","AAA","aaa","BBB","ccc","CCC");
            l.sort((o1, o2) -> {
                int compareIgnoreCaseResult = o1.compareToIgnoreCase(o2);
    
                if (compareIgnoreCaseResult != 0){
                    return compareIgnoreCaseResult;
                }
    
                return o1.compareTo(o2);
            });
            System.out.println(l);
        }
    }
    
     

    【讨论】:

    • @anhqan,我没有提到“区分大小写的排序”,我需要按上述问题中的预期排序。
    【解决方案3】:

    以下代码可帮助您对 CASE_INSENSITIVE_ORDER 中的字符串进行排序。这里需要对列表进行两次排序。

    public static void main(String[] args) {
      List<String> l = Arrays.asList("a", "A", "A", "a", "B", "c", "C");
      Collections.sort(l);
      Collections.sort(l, String.CASE_INSENSITIVE_ORDER);
      System.out.println(l);
    }
    

    【讨论】:

    • @MohanReddy 我的回答对字符串进行排序而不是字符。
    • 谢谢,您的回答符合我的预期。但为什么需要调用 2 次 sort()?有什么解释吗?
    • 在第一次使用CASE_SENSITIVE_ORDER 排序时,所有大写单词在前,小写单词在最后。像 [A, A, B, C, a, a, c] 当我们使用CASE_INSENSITIVE_ORDER 进行第二次排序时,它只排列小写单词。像 [A, A, a, a, B, C, c]
    【解决方案4】:
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    public class SortStrings {
    
        public static void main(String[] args) {
            Comparator<String> comparator = new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    if(o1 == null) {
                        return 1;
                    }
                    if(o2 == null) {
                        return -1;
                    }
                    int result = o1.compareToIgnoreCase(o2);
                    if(result != 0) {
                        return result;
                    }
                    return o1.compareTo(o2);
                }
            };
    
            List<String> list = Arrays.asList("A","a","A","a", "B", "c","C");
            Collections.sort(list, comparator);
            System.out.println(list);
            // [A, A, a, a, B, C, c]
    
            List<String> list2 = Arrays.asList("Ab","a","AB", "A", "AbB", "a","B","c","C");
            Collections.sort(list2, comparator);
            System.out.println(list2);
            // compare length first
            // [A, a, a, AB, Ab, AbB, B, C, c]
    
            List<String> list3 = Arrays.asList("aaa","AAA","AAA","aaa","BBB","ccc","CCC");
            Collections.sort(list3, comparator);
            System.out.println(list3);
            // [AAA, AAA, aaa, aaa, BBB, CCC, ccc]
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-10
      • 2021-09-21
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 2013-09-04
      • 1970-01-01
      相关资源
      最近更新 更多