2017-10-15 241 views
-1

我正在尝试对字符列表进行排序,并按照频率顺序和相关频率输出它们。例如,如果用户将在 “beeeerr”,我希望它出来把 “E频率:4,R频率:2,B频率:1”Java:使用数组按频率对字符列表进行排序

这是我到目前为止有:

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轻松做到这一点,但我不能使用它们。任何帮助,将不胜感激

回答

0
//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 
+0

的Java使用Unicode。这个问题从''到'〜'有一系列的兴趣。您引用的128个字符是[C0控件和基本拉丁语](http://www.unicode.org/charts/nameslist/index.html)块,256将添加C1控件和拉丁-1补充块。提起ASCII会引起混淆,而扩展的ASCII-就是如此不精确以至于几乎没有用处。在Unicode的情况下,您必须指定ISO 8859-1。与[Java文档](https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html)所描述的一样,处理字符串,字符和字符不是很容易吗? –

+0

感谢您的纠正。对于这个问题,您可以将128更改为unicode集中的字符数。 – taobupt

0

与Java 8个流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())); 
相关问题