Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:仅使用数组按频率对字符列表进行排序_Java_Arrays_Sorting - Fatal编程技术网

Java:仅使用数组按频率对字符列表进行排序

Java:仅使用数组按频率对字符列表进行排序,java,arrays,sorting,Java,Arrays,Sorting,我试图对字符列表进行排序,并按照频率顺序及其相关频率输出它们。例如,如果用户输入beeerr,我希望它输出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

我试图对字符列表进行排序,并按照频率顺序及其相关频率输出它们。例如,如果用户输入beeerr,我希望它输出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或ArrayList轻松实现这一点,但我不允许使用它们。非常感谢您对Java 8 Stream API的任何帮助,您通常可以使用一行程序执行此类操作:

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

Java使用Unicode。这个问题的兴趣范围从“”到“~”。您引用的128个字符是块,256个字符添加C1控件和拉丁语-1补充块。提到ASCII会引起混乱,而扩展的ASCII是如此的不精确以至于几乎没有用处。在Unicode的上下文中,您一定是指ISO 8859-1。是不是很容易处理的字符串,字符和字符的描述?谢谢你的更正。对于这个问题,您可以将128更改为unicode集中的字符数。