5

配列内のさまざまな文字列のインスタンスをカウントする次のコードがあります。

String words[] = {"the","cat","in","the","hat"};
HashMap<String,Integer> wordCounts = new HashMap<String,Integer>(50,10);
for(String w : words) {
    Integer i = wordCounts.get(w);
    if(i == null) wordCounts.put(w, 1);
    else wordCounts.put(w, i + 1);
}

これは正しい方法ですか?単純なタスクには少し時間がかかるようです。HashMap文字列でインデックスを作成するので、結果は役に立ちます。

ラインが気になる

else wordCounts.put(w, i + 1);

key-valueという事実により、2 番目のペアが挿入される可能性があります。

new Integer(i).equals(new Integer(i + 1));

は false になるので、2 つIntegersが同じStringキー バケットの下にあることになりますよね? それとも、自分を隅に追いやっただけですか?

4

6 に答える 6

8

コードは機能しますが、 GuavaHashMultisetから使用する方が簡単です。

// Note: prefer the below over "String words[]"
String[] words = {"the","cat","in","the","hat"};
Multiset<String> set = HashMultiset.create(Arrays.asList(words));

// Write out the counts...
for (Multiset.Entry<String> entry : set.entrySet()) {
    System.out.println(entry.getElement() + ": " + entry.getCount());
}
于 2012-10-31T17:33:05.937 に答える
6

はい、あなたはそれを正しい方法でやっています。同じキーが提供されている場合、HashMap は値を置き換えます。

のJavaドキュメントからHashMap#put

指定された値をこのマップ内の指定されたキーに関連付けます。マップに以前にキーのマッピングが含まれていた場合、古い値が置き換えられます。

于 2012-10-31T17:31:43.977 に答える
2

あなたのコードは完全に問題ありません。文字列を整数にマップします。重複するものはありません。

于 2012-10-31T17:31:52.783 に答える
2

HashMap はキーの重複を許可しないため、マップに複数の同じキーと値のペアを含める方法はありません。

于 2012-10-31T17:32:11.987 に答える
0

あなたのコードは私には問題ないように見えますが、問題はありません。Java 8 機能のおかげで、次のように単純化できます。

String words[] = {"the","cat","in","the","hat"};
HashMap<String,Integer> wordCounts = new HashMap<String,Integer>(50,10);
for(String w : words) {
     wordCounts.merge(w, 1, (a, b) -> a + b);
}

次のコード

System.out.println("HASH MAP DUMP: " + wordCounts.toString());

印刷します。

HASH MAP DUMP: {cat=1, hat=1, in=1, the=2}
于 2018-09-26T13:04:59.190 に答える
0

これは、一般化され、toString() の値による並べ替えオプションを持つ必要がある String 固有のカウンターですが、同様のものを見つけることができないため、問題に対するオブジェクト指向のラッパーです。

package com.phogit.util;

import java.util.Map;
import java.util.HashMap;

import java.lang.StringBuilder;

public class HashCount {

    private final Map<String, Integer> map = new HashMap<>();

    public void add(String s) {
        if (s == null) {
            return;
        }
        Integer i = map.get(s);
        if (i == null) {
            map.put(s, 1);
        } else {
            map.put(s, i+1);
        }
    }

    public int getCount(String s) {
        if (s == null) {
            return -1;
        }
        Integer i = map.get(s);
        if (i == null) {
            return -1;
        }
        return i;
    }

    public String toString() {
        if (map.size() == 0) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        // sort by key for now
        Map<String, Integer> m = new TreeMap<String, Integer>(map);
        for (Map.Entry pair : m.entrySet()) {
            sb.append("\t")
              .append(pair.getKey())
              .append(": ")
              .append(pair.getValue())
              .append("\n");;
        }
        return sb.toString();
    }

    public void clear() {
        map.clear();
    }
}
于 2015-09-03T21:45:30.270 に答える