1

結果セットをマップのマップに変換する必要があります。マップのリストを使用しない理由は、特定の行を取得するためにリスト全体を反復処理したくないためです。

私が今直面している問題は、インデックスが16より大きい場合、HashMapのエントリが順序付けられなくなることです。

今、私は簡単なテストのために以下を試しました:

    public static void main(String[] args) {

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

    //creating 20 rows from 1 to 20
    for (int i = 1; i <= 20; i++){
        map.put(i, "ROW "+i);   
    }


    //returning all the rows the map contains. Look at position 16.
    for(int key : map.keySet()){
        System.out.println(key);    
    }
}

そして、出力は次のとおりです(位置16から20を見てください。それらは完全に順序付けられていません):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 16 19 18 20

なぜそうなるのか説明していただければ幸いです。

ところで:

私はこのようなものを使用することはできません:

for (int i = 0; i < map.size; i++){
    map.get(i) //...and so on

}

インデックスが存在するかどうかわからないからです。200から800までのインデックスが存在しない可能性があります。したがって、マップの既存のエントリを反復処理するだけの方がよいでしょう。

4

6 に答える 6

6

AHashMapは順序付けもソートもされていません。挿入オーダーが必要な場合は、 をMap使用してjava.util.LinkedHashMapください。Mapキーでソートする必要がある場合は、次のSortedMapようなものを使用しますjava.util.TreeMap

于 2012-05-18T20:17:16.867 に答える
4

要素を自然順序または挿入順序でソートするかどうかに応じて、HashMap の代わりにTreeMapまたはLinkedHashMapを使用する必要があります。

HashMap は、キーの順序について保証しません。私が参照した他の 2 つの Map 実装はそうです。

TreeMap は自然な順序に基づいてキーを並べ替えます。つまり、順序を決定するには、キーが Comparable を実装するか、独自のコンパレータを提供する必要があります。

LinkedHashMap は、挿入された時点に基づいてキーの順序を維持します。

あなたが探している動作は、キーが自然に順序付けられることであり、たまたま自分でキーを順番に挿入しているため、この場合はどちらの実装でも機能します。

于 2012-05-18T20:18:48.300 に答える
3

基本マップはキーの順序を保証しないため、代わりにLinkedHashMapを使用して挿入の順序を維持できます。

于 2012-05-18T20:17:27.477 に答える
3

TreeMap を使用するのはどうですか。HashMap の代わりに。独自の注文でも提供できます。

于 2012-05-18T20:18:58.813 に答える
2

マップのリストを使用しない理由は、特定の行を取得するためにリスト全体を反復処理したくないためです。

したがって、のArrayList代わりに作成しLinkedListます。そうlist.get(1234)すれば、そのエントリに直接移動します。その前の1234エントリを反復処理することはありません。

于 2012-05-18T21:53:14.977 に答える
1

あなたが直面している問題は、HashMap のデフォルト サイズが原因だと思います。

標準のJavaドキュメントによると、

/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 16;
/**
 * The load factor used when none specified in constructor.
 */
static final float DEFAULT_LOAD_FACTOR = 0.75f;

/**
 * Constructs an empty <tt>HashMap</tt> with the default initial capacity
 * (16) and the default load factor (0.75).
 */
public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR;
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
    table = new Entry[DEFAULT_INITIAL_CAPACITY];
    init();
}

したがって、16 番目の要素の後に適切な出力が得られません。

JavaDocによると、

/**
 * Constructs an empty <tt>HashMap</tt> with the specified initial
 * capacity and the default load factor (0.75).
 *
 * @param  initialCapacity the initial capacity.
 * @throws IllegalArgumentException if the initial capacity is negative.
 */
public HashMap(int initialCapacity) {
    this(initialCapacity, DEFAULT_LOAD_FACTOR);
}

以下を試してください(初期容量を持つパラメーター化されたコンストラクター)、

Map<Integer, String> map = new HashMap<Integer, String>(32);
于 2012-05-28T14:06:03.060 に答える