【问题标题】:Java: Sort a list of characters by frequency only using arraysJava:仅使用数组按频率对字符列表进行排序
【发布时间】:2023-03-21 13:23:01
【问题描述】:

我正在尝试对字符列表进行排序,并按频率顺序及其相关频率输出它们。例如,如果用户输入“beeeerr”,我希望它输出“e freq: 4, r freq: 2, b freq: 1”

这是我目前所拥有的:

public static void sort(String charInput) {
    int frequency = 0;
    char [] charArray = charInput.toCharArray();

    for (char charValue = ' '; charValue <= '~'; charValue++) {
        frequency = 0;
        for (int i = 0; i < charInput.length(); i++) {
            char compare = charArray[i];
            //charInput.charAt(i)
            if (compare == charValue) {
                frequency += 1;
            }
        }
        if (frequency > 0) {
            System.out.println(charValue + " freq: " + frequency);
        }
    }

}

问题在于它按字母顺序输出频率。我不知道如何按频率对输出进行排序。我知道如何使用 Hashmaps 或 Arraylists 轻松做到这一点,但我不允许使用它们。任何帮助将不胜感激

【问题讨论】:

    标签: java arrays sorting


    【解决方案1】:
    //128 is for ascii, change it to 256 for extended ascii
    //I assume all characters in the input are in ascii or extended ascii
    public void frequencySort(String s) {
        int n = s.length();
        List<Character>[]res = new ArrayList[n+1];
        int []cnt = new int[128]; 
        char []ss = s.toCharArray();
        for(int i=0;i<n;++i){
            res[i+1]=new ArrayList<>();
            cnt[ss[i]]++;
        }
        for(int i=0;i<128;++i){
            if(cnt[i]!=0){
                res[cnt[i]].add((char)i);
            }
        }
    
        for(int i=n;i>0;--i){
            if(!res[i].isEmpty()){
                for(char c:res[i])
                System.out.println("input has "+i+" " +c);
            }
        }
    }
    input has 4 e
    input has 2 r
    input has 1 b
    

    【讨论】:

    • Java 使用 Unicode。这个问题的兴趣范围从 ' ' 到 '~'。您所指的 128 个字符是 C0 Controls and Basic Latin 块和 256 个添加 C1 Controls 和 Latin-1 Supplement 块。提及 ASCII 会引起混淆,而扩展 ASCII 会导致混淆——嗯,这太不精确了,几乎没有用处。在 Unicode 的上下文中,您一定是指 ISO 8859-1。像Java documentation 描述的那样,处理字符串、字符和字符不是要容易得多吗?
    • 感谢您的指正。对于这个问题,你只需将 128 更改为 unicode 集中的字符数即可。
    【解决方案2】:

    使用 Java 8 Stream API,您通常可以使用一个衬垫执行此类操作:

        str.chars().mapToObj(e->(char)e).collect(Collectors.toSet()).stream()
            .collect(Collectors.toMap(ch -> ch, ch -> str.length() - str.replaceAll(ch.toString(), "").length()))
            .entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
            .forEach(e -> System.out.println(e.getKey() + " freq: " + e.getValue()));
    

    【讨论】:

      猜你喜欢
      • 2021-01-20
      • 2020-06-13
      • 1970-01-01
      • 2020-02-06
      • 2021-05-26
      • 1970-01-01
      • 2021-07-28
      • 2020-10-19
      相关资源
      最近更新 更多