Java:仅使用数组按频率对字符列表进行排序
我试图对字符列表进行排序,并按照频率顺序及其相关频率输出它们。例如,如果用户输入beeerr,我希望它输出e freq:4、r freq:2、b freq:1 以下是我目前掌握的情况: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
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集中的字符数。