2016-05-10 4 views
0

これはコードを書く上での初めての経験です。HashMapHashSetです。どこから始めたらいいですか?ファイルを読み込み、使用する文字列の数をカウントしたいが、HashMapHashSetを使ってこれを行う必要がある。ファイルを読み込んで、HashMapとHashSetを使って単語の数を吐き出してください

どこから始めたらいいですか?

私はファイルを読み、配列に文字列を入れ、それを配列から読み取ってHashSetに入れますか?これはばかげた考えですか?

プログラム内で唯一O(n)操作がテキストファイルを反復処理する必要があるという制約があります。

+3

地図のキーはすでにセットに含まれているため、地図だけをセットにする必要はありません。 'Map 'が必要です。ここで、単語を参照するキーは文字列であり、値はカウントである整数です。したがって、単語単位でファイルの単語を読み取り、キーマッピングがマップに存在しない場合は1の数でマップに単語を追加し、キーマッピングが存在する場合は1ずつ増やします。 – dabadaba

+0

ループ内の行を読み込みます。行内のすべての単語について、頻度テーブルでその数が増えます。 –

+0

この整数はどのように返すことができますか?または私はそれを別の変数に格納して戻すべきですか? – sajaMega

答えて

0

は、最初のあなたは今、すべてのトークンを読んで、今トークン 内のすべての単語を分割しますjava.util.StringTokenizerクラス.ITを使用して文字列オブジェクト にファイルやストアからデータ全体を読んで);

は私の知識を増やすことで協力いただき、ありがとうございます1つずつ HashMap

に値としてキーとその周波数として 利用の単語を次のようにそれを確認し
HashMap map=new HashMap(); 
HashSet set=new HashSet(); 
StringTokenizer st = new StringTokenizer(strObj); 
String s; 
while (st.hasMoreTokens()) { 
    s=st.nextToken(); 
    if(map.containsKey(s)) 
    { 
     count=(Integer)map.get(s); 
     count++; 
     map.put(s,count); 
     set.add(s); 
    } 
    else 
    { 
     map.put(s,count); 
     set.add(s); 
    } 
} 
+3

セットを削除すると、冗長データ(キーワードの保守性)のみが保存されます。実際にそのようなセットが必要な場合は、 'map.keySet();'でいつでも取得できます。私の論理を洗練させるためには – Aconcagua

+0

thanx。 –

0

あなたは近いですが、真ん中の男(その配列)を逃すことができます。

HashMap<String, Integer>を使用すると、文字列のカウントに文字列のマップを格納できます。あなたがプログラムを実行する必要がどのような
は次のとおりです。

  1. は、ファイルから次の文字列を読み込みます。
  2. 、その文字列は、あなたの中にHashMapが存在するかどうかを確認します。
    1. それが存在しない場合は、単に、マップから上にIntegerStringマップそれをつかむそれをインクリメントし、マップに戻します。それが存在しない場合、ファイルが読み込まれるまで
    2. は、ステップ1から Integer 1.
  3. 繰り返してマップにStringを置きます。
  4. グラブCollection<Integer> counts = map.values();
  5. 和にストリームにint sum = counts.stream().mapToInt(i -> i).sum();
  6. 出力sumの値を使用してコレクションを使用して値HashMapから収集し、それを保存します。

自分でコードを変換することができますか? :)


あなたはHashMaphere詳細(values()方法をチェックしてください)、Streamhere詳細は、ステップ5 hereからのコードのそのファンキーな少し上の詳細情報を見つけることができます。

+0

整数は不変なので、新しいインスタンスをマップに配置する必要があります。これが私の答えに自分のラッパークラスを使った理由です。 – Aconcagua

+0

@Aconcaguaあなたはそうです。プロセスを少し明確にするために私の答えを更新します。ありがとう。 – Tiz

0

Sharadの答えに加えて:ファイルからの読み込み...

// would loved to use Integer, but it is immutable... 
class Wrapper 
{ 
    public Wrapper(int value) 
    { 
     this.value = value; 
    } 
    public int value; 
} 

HashMap<String, Wrapper> counts = new HashMap<String, Wrapper>(); 
Scanner scanner = new Scanner(new File(fileName)); 
while(scanner.hasNext()) 
{ 
    String token = scanner.next(); 
    Wrapper count = counts.get(token); 
    if(count == null) 
    { 
     counts.put(token, new Wrapper(1)); 
    } 
    else 
    { 
     ++count.value; 
    } 
} 
scanner.close(); 

私は値がマップにすでにある場合は二回ハッシュ値を計算する必要がない、少しシャラドのアルゴリズムを変化させ、そしてジェネリックを使用してキャストする必要がなくなります。

ファイル内の文字列のみが必要な場合は、counts.keySet();で取得します。

+0

ありがとう、私は最後の質問があります。あなたが提供したコードはどんなクラスに入っていますか? – sajaMega

+0

@SaidaHoca多くのオプションがあります。プログラム内で何もしたくない場合は、mainを含むクラスの内部クラスとしてWrapperクラスを作成し、メインメソッドに直接ループを配置して、結果を出力するためにマップを繰り返し処理します。ループを別のメソッド(mainと平行)にすると、HashMapが返されます。または、内部クラスとしてWrapperを使用し、静的メソッドでループを使用して別のクラスを作成することもできます。あるいは、HashMapをメンバ変数とし、ループ(スキャナインスタンスを含む)を非静的メソッドに配置することもできます。 – Aconcagua

+0

私はあなたが言ったことを得て、それをやろうとしましたが、getメソッドを解決できないというエラーがあります:/ – sajaMega

関連する問題