【问题标题】:Java custom sorting charactersJava自定义排序字符
【发布时间】:2021-01-19 06:10:21
【问题描述】:

我有一个字符串,例如crccoaaroac。如何编写使用自定义排序,使字符串中的字母按以下顺序排列:

1) c
2) r
3) o
4) a

因此,排序后的字符串将为cccrrooaaa 我对 Java 比较陌生。我知道如何进行升序和降序排序,但是有什么好方法可以自定义排序呢?

【问题讨论】:

  • 将字符串分解为一个字符数组。使用您的自定义订单手动进行排序,或使用比较器。顺便说一句:如果字符串中有第五个字符(可能是'x')会发生什么?
  • @NomadMaker 我想将其分解为 LinkedHashMap> 但不确定如何按键自定义排序。只有这 4 个字符。
  • 我只会使用 Set 或者 HashMap (Character 来保存 char,Integer 来保存它们的数量)。您的订单是具体的。你可以有一个数组 char[] order = {'c', 'r', 'o', 'a'} 或者只是硬编码它。
  • @NomadMaker 你能写一个像这样的例子吗:Map<Character, List<Integer>> mp = new LinkedHashMap<>(); mp.entrySet().stream().sorted( <WHAT DO I DO HERE??>) ) 我认为在 java 8 中会是这样的吗?
  • 我只是使用一个循环。我退休了,没有使用过 j8 流。

标签: java string sorting


【解决方案1】:

正如@Stef 所说,您可以通过计算每个字符出现的频率来做到这一点,然后根据您想要的特定顺序重新编写它们。

import java.util.*;

public final class StackOverflow {

    private static String reorder(String s, char[] ordering) {
        Map<Character, Integer> charCount = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char currentChar = s.charAt(i);
            int currentCount = charCount.getOrDefault(currentChar, 0);
            charCount.put(currentChar, currentCount + 1);
        }

        StringBuilder builder = new StringBuilder();
        for (char ch : ordering) {
            int count = charCount.getOrDefault(ch, 0);
            builder.append(String.valueOf(ch).repeat(count));
        }
        return builder.toString();
    }

    public static void main(String[] args) {
        String reordered = reorder("crccoaaroac", new char[]{'c', 'r', 'o', 'a'});
        System.out.println(reordered);
    }
}

哪些打印:

ccccrrooaaa

【讨论】:

    【解决方案2】:

    下面是你如何做到这一点,包括 cmets:

            //your input
            String str= "crccoaaroac";
            // your character rank
            Map<Character, Integer> rank = new HashMap<>();
            rank.put('c', 1);rank.put('r', 2);rank.put('o', 3);rank.put('a', 4);
            // final result builder 
            StringBuilder sb = new StringBuilder();
            
            //actual sorting using your custom comparator
            str.chars().boxed().map(e->(char)e.intValue() ).
            sorted((a,b)-> rank.get(a)- rank.get(b)).forEach(e-> sb.append(e));
            
            //final result
            String result = sb.toString();
            System.out.println(result);
    

    【讨论】:

      【解决方案3】:

      您可以使用Enum 来定义您的自定义排序顺序。

      根据规范 (Enum#compareTo):

      枚举通过枚举的自然顺序(值的声明顺序)实现 Comparable。

      import java.util.stream.Collectors;
      
      class CustomSort {
          enum CustomSortOrder {
              c,
              r,
              o,
              a,
          }
      
          public static void main(String[] args) {
              String unsorted = "cccaaaoorr";
              String sorted = unsorted.chars().mapToObj(i -> (char) i)
                  .map(x -> CustomSortOrder.valueOf(String.valueOf(x)))
                  .sorted()
                  .map(String::valueOf)
                  .collect(Collectors.joining());
              System.out.println(sorted);
          }
      }
      

      编辑:格式化

      【讨论】:

        【解决方案4】:

        使用收集到LinkedHashMap 的流来维护字符插入映射的顺序的示例(即,对于字符串ccooccroca,结果将被排序为cccccooora):

        String s = "crccoaaroac";
                
        String str = s.chars()
                      .mapToObj(i -> (char)i)
                      .collect(Collectors.groupingBy(
                          x -> String.valueOf(x), LinkedHashMap::new, Collectors.counting()))
                      .entrySet()
                      .stream()
                      .peek(System.out::println)  // debug print
                      .map(e -> e.getKey().repeat(e.getValue().intValue()))
                      .collect(Collectors.joining(""));
                 
        System.out.println(str);
        

        输出

        c=4
        r=2
        o=2
        a=3
        ccccrrooaaa
        

        【讨论】:

          猜你喜欢
          • 2015-09-22
          • 1970-01-01
          • 1970-01-01
          • 2017-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-26
          • 2020-05-29
          相关资源
          最近更新 更多