6

したがって、文字のマルチセットのようなものを用意する必要があります。重複する文字を追加すると、カーディナリティが 1 増加します。文字の多重度によって、オブジェクトが占有するメモリが大幅に増加することはありません。

これは、文字がキーであり、その文字の数を表す値を保持する、ある種のマップで実装され、セットで表されます。

ただし、これに最適なコレクション (ハッシュマップを見ていました) と、このデータ型を宣言する方法を理解するのに苦労しています。私はこのようなことをしていました

Map m = new HashMap(char, int);

しかし、上記は間違った宣言であり、これに正確にアプローチする方法がわかりません。

4

5 に答える 5

8

この宣言を試してください:

Map<Character, Integer> m = new HashMap<Character, Integer>();

次に、そのように文字を追加できます。

char c = //...;
if (m.containsKey(c))
    m.put(c, m.get(c) + 1);
else
    m.put(c, 1);
于 2012-11-28T00:09:24.600 に答える
3

int[](ASCIIの場合)またはint[][]Unicodeを使用して実装します。ボックス化された整数をハッシュマップに格納するメモリフットプリントを考えると、数字を使用することによってすべてのハッシュの競合が発生し、文字はキーとしての数字に他なりません。

public class CharacterBag {

    private int[][] data = new int[255][];

    public void add(char ch) {
        int[] bin = data[ch >> 8];
        if (bin == null) bin = data[ch >> 8] = new int[255];
        bin[ch & 0xFF]++;
    }

    public int frequency(char ch) {
        int[] bin = data[ch >> 8];
        if (bin == null) return 0;
        return bin[ch & 0xFF];
    }

}

これは、ゼロのメモリフットプリントから始まり、Unicodeページごとに2Kを追加します。通常、テキストは1つまたは2つのUnicodeページの文字を使用します。

比較すると、HashMapを使用すると、ボックス化されたプリミティブをリンクリストのリストに格納するオーバーヘッド全体が発生します。文字ごとEntryに、ボックス化されたキーを指す2つのポインターを持つクラスのオブジェクトと、すべてのフィールドを持つリンクリストオブジェクトがあります。このオブジェクトはNode、前方ポインターと後方ポインターを持つクラスのオブジェクトを保持し、ボックス化された整数へのポインターを持ちます。 …続けましょうか?;)

于 2012-11-28T08:56:44.890 に答える
1
Map<Character, Integer> charCount = new HashMap<Character, Integer>();

public void addCharacter(char c) {
    Integer value = charCount.get(c);
    if (value == null) {
        charCount.put(c, 1);
    } else {
        charCount.put(c, value + 1);
    }
}
于 2012-11-28T00:13:34.353 に答える
0

私によると、最善の方法は、コンストラクターを使用することです。

Map<Key, Value> orgMap = new HashMap<Key, Value>();
Map<Key, Value> copyMap;
copyMap= new HashMap<Key, Value>(map);

複雑にしないでおく。

于 2014-04-03T15:06:54.393 に答える
0

Java コレクションでは、プリミティブ型のコレクションを作成することはできません。むしろ、それぞれのラッパー クラスを使用する必要があります (たとえば、int のラッパー クラスは Integer です)。

Map<Character,Integer> hashMap = new HashMap<Character,Integer>();

これは、マップを宣言する方法です。より多くの例と説明については、こちらをご覧ください

于 2012-11-28T00:19:50.387 に答える