2016-04-16 27 views
0

私はクラスのためのVigenere解読プログラムを構築しようとしています。命令は、プログラムが複数の言語のために解読できることを必要とする。だから、私は文字列のハッシュセットを反復処理し、それらの文字列に含まれる文字の配列だけでなく、各文字が何回発生するかを調べる必要があります。私は今かなり長い間努力してきましたが、私が書くことは何も働いていません。 `文字列のハッシュセットから文字の配列を作成する方法は?

public char mostCommonCharln(HashSet<String> dictionary) { 
    for (String s : dictionary) { 
     //what do I write here??? // 
     return Characters; 
    } 
} 
+0

は、あなたのメソッドのシグネチャによると、単一の 'char'を返すことになっています。メソッドの名前から、私は、メソッドが文字列内の最も出現頻度の高い文字を 'dictionary'で返すようにしたいと思いますか? – dpr

+0

はい、この方法で期待されることを明確にしてください。 – totoro

+0

ありがとうございました。不明な点がありましたら申し訳ありません。このメソッドは、文字列sで検出したすべての文字を返し、文字が何回発生したかを追跡します。例えば、AABBBCDDはA(2)B(3)C(1)D(2)を返します。私はこれを行う最良の方法は、配列に各オカレンスを追加することですが、ハッシュセットを反復することでこれを達成することは私を混乱させます(注 - コースの指示はfor(文字列s:辞書)を使用することを提案します – Ryan

答えて

1

私はあなたが欲しい署名があると仮定します:

public static List<CharFrequency> mostCommonChars(Set<String> dictionary) 
CharFrequencyクラスは次のように定義されて

class CharFrequency implements { 

    private char value; 
    private int count; 

    public CharFrequency(char v, int c) { 
     this.value = v; 
     this.count = c; 
    } 

    @Override 
    public String toString() { 
     return value + " -> " + count; 
    } 
} 

そして、あなたは以下の方法があります:

import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.Set; 
import java.util.List; 
import java.util.stream.Collectors; 
import java.util.function.Function; 

    public static List<CharFrequency> mostCommonChars(Set<String> dictionary) { 
    // Concat all strings present in dictionary into a big string 
    String allchars = dictionary.stream().collect(Collectors.joining()); 
    // Then convert it to a List<Character> which can use Java Streams 
    List<Character> charList = new ArrayList<>(allchars.length()); 
    for (char c : allchars.toCharArray()) { 
     charList.add(c); 
    } 

    final List<CharFrequency> result = new ArrayList<>(); 
    charList.stream() 
      // Group by the char itself and count occurrences 
      .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) 
      .forEach((character, count1) -> result.add(new CharFrequency(character, count1))); 
    return result; 
} 

これはあまり効率的ではありません。私は別の入力を試みることなくそれを書いてきましたが、それはあなたの出発点として役立ちます。

+0

ありがとうございました!私はそれを(とそれを理解しようとする) – Ryan

+0

コードのコメントを参照してください – marcospereira

+0

あなたが書いたものからいくつかの部分を取り、今は動作しますが、少し修正しました。また、新しいJARファイルをダウンロードして、しかし、結局、これは私の問題を解決したので、あなたに大きな感謝 – Ryan

0

最終的な答え:

public char mostCommonCharln(HashSet<String> dictionary){ 
    StringBuilder sb= new StringBuilder(); 
    //String allChars = sb.toString(); 
    String alph = "abcdefghijklmnopqrstuvwxyz"; 
    int[] counts= new int[26]; 
    String allChars =dictionary.stream().collect(Collectors.joining()); 
    for (int k = 0; k<allChars.length();k++){ 
     char ch = Character.toLowerCase(allChars.charAt(k)); 
     int dex = alph.indexOf(ch); 
     if(dex != -1){ 
      counts[dex]+=1; 
     } 
    } 
    int maxDex = 0; 
    for (int i=0;i<counts.length;i++){ 
     if (counts[i]>counts[maxDex]){ 
      maxDex=i; 
     } 
    } 
    char mostFreq=alph.charAt(maxDex); 
    System.out.println (mostFreq); 
    return mostFreq; 
} 
+0

'char'は必ずしもlettではないという事実を知っていますか?それともあなたの辞書の文字だけを数えることを意図していますか? – dpr

関連する問題