2017-10-15 9 views
-1

文字のリストをソートし、関連する頻度で頻度順に出力しようとしています。ユーザーは "beeeerr" に入れた場合、私はそれを出したい "のE FREQ:4、RのFREQ:2、BのFREQ: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でこれを簡単に行う方法を知っていますが、それらを使うことは許されません。すべてのヘルプははるかにJavaの8ストリームAPIで

答えて

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 Controls and Basic Latin](http://www.unicode.org/charts/nameslist/index.html)ブロックで、256はC1コントロールとLatin-1補足ブロックを追加します。 ASCIIを言及すると混乱が起こります。拡張ASCIIもそうではありません。 Unicodeのコンテキストでは、ISO 8859-1を意味する必要があります。 [Javaのドキュメント](https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html)に記載されているように、文字列、文字、および文字を処理する方がはるかに簡単ですか? –

+0

訂正していただきありがとうございます。この問題では、Unicodeで設定された文字数に128を変更できます。 – taobupt

0

をいただければ幸いです、あなたは通常、1つのライナーで、このような操作を行うことができます。

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())); 
関連する問題