2017-01-31 7 views
0

私はJavaのコースでHashMapsについて学んでいます.HashMapにテキストファイルのすべての単語を格納し、それぞれのユニークな単語と量を出力するタスクがありますそのファイル内での出現。私はこれを行う方法を見つけ出すことができませんでしたHashMapファイル内の文字列の出現[JAVA]

はので、ここで助けを検索し、このリンクを見つけた:Using HashMap to count instances

私が適応と使用ポスターのコードを自分のプログラムに、それが働いていたが、私は完全には理由を理解していません私は自分自身をしなかったことを私が理解していない何かを与えたくありません。

以下に完全なコードを掲載しましたが、誰かがセクションのコメント機能について説明してください。リスト内のすべての文字列については

public class Q3HM { 
    public static void main(String[] args) { 
     HashMap<String, Integer> map = new HashMap<String, Integer>(50, 10); 
           *****//Not sure what the (50,10) is for 

     try { 
      File input = new File("input.txt"); 
      Scanner read = new Scanner(new FileInputStream(input)); 
      ArrayList<String> list = new ArrayList<>(); 

      while (read.hasNext()) { 
       list.add(read.next()); 
      } 

    *******//Not sure how the below for loop works 
      for (String w : list){ 
       Integer i = map.get(w); 
       if(i == null){ 
        map.put(w, 1); 
       } 
       else { 
        map.put(w, i+1); 
       } 
      } 
    *******//End of section I'm confused about 

      System.out.println(map.toString()); 
     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
+0

あなたの質問を最も重要ではないのはなぜですか?それはあなたが実際にループのために興味を持っているものですか? https://docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html – Roland

+0

また、[javadoc from HashMap(int、float)](https: //docs.oracle.com/javase/8/docs/api/java/util/HashMap.html#HashMap-int-float-)を「(50、10)」に追加します。しかし、解決策を探す前に、少なくともそれを自分で解決しようとしてください。 – Roland

答えて

3
for (String w : list) { 
    Integer i = map.get(w); 
    if(i == null) { 
     map.put(w, 1); 
    } 
    else { 
     map.put(w, i+1); 
    } 
} 


           は古い値を取得し、iとして保存。文字列は(inullある)マップではまだない IF
            、挿入1(最初の出現)
            OTHERWISE、挿入(I + 1) (現在のカウントに1を加えます)

さらに書き換え可能な書き換えは、

for (String word : list) {     //For every word in list, 
    Integer previousAmount = map.get(word); //Get the current count and store it. 
    if(previousAmount == null)    //If the count doesn't exist (null, not in map), 
     map.put(word, 1);     //Put 1 in the map (first time.) 
    else         //Otherwise (in the map) 
     map.put(word, previousAmount + 1); //Add one to the current amount 
} 

これも単に

for(String w : list) 
    map.put(w, map.getOrDefault(w, 0) + 1); 
+0

'map.get(word)'はマップ内の単語を検索し、その単語のカウント(キー)を 'previousAmount'に保存し、カウント(キー)をインクリメントするか、単語を '1カウント? 私の考えは正しいのですか、それとも鍵ではないのですか? –

+1

@ c.timothy 'word'がキーです。' count'は値です。 'map.get(word)'を使うことで、その特定の 'String'に関連付けられた' Integer'が得られます。これは 'HashMap ' - 'String'sがキーで、' Integer'が値である理由です。おそらくあなたは鍵と価値を混同していますか? – Moira

+0

ああ大丈夫です。わかりました。私はキーと値を混同していました。したがって、文字列がマップに含まれているかどうかをチェックします。値が1の場合はマップに単語を追加します。 –

1
for (String w : list){ 
    Integer i = map.get(w); 
    if(i == null){ 
    map.put(w, 1); 
    } 
    else { 
    map.put(w, i+1); 
    } 
} 

のように書かれている可能性があれば、文字列(ワット)HashMapの(map.get(w))であり、その後、新しい文字列はHashMapの中に導入されます。それ以外の場合は、文字列が導入され、カウンタが変更されます(i+1

1

私は明確なコメントが多く役立つことがわかります。

// For each word in the list. 
    for (String w : list) { 
     // Get it's current count from the Map. 
     Integer i = map.get(w); 
     if (i == null) { 
      // Null means never seen before so it's count becomes 1 
      map.put(w, 1); 
     } else { 
      // Seen this word - add one to the count. 
      map.put(w, i + 1); 
     } 
    } 
+0

'カウント'はキーですか、キーですか、別々のものですか? –

関連する問題