2017-11-09 6 views
0

目的は、HashtablesのベクトルをHashtablesで塗りつぶすことです。ベクトルは最後の項目のみで塗りつぶされます

Vector<Hashtable<String, String>> v = new Vector<Hashtable<String, String>>(); 
Hashtable<String,String> h = new Hashtable<String,String>(); 

while(cursor.moveToNext()) { 
    h.put("name", cursor.getString(0)); 
    h.put("region", cursor.getString(1)); 
    h.put("_id", cursor.getString(2)); 

    v.addElement(h); 
} 

結果、最後でいっぱいベクトルです、私はカーソルを反復、そうカーソルがHashtableに見つけたものを入れて、そのようには次のように、ベクトルにハッシュテーブルを追加するには

カーソルがX要素を反復処理する場合、Vectorは最後に作成されたハッシュテーブルのX倍を持ちます。この1行が問題解決

追加:

Vector<Hashtable<String, String>> v = new Vector<Hashtable<String, String>>(); 
Hashtable<String,String> h = new Hashtable<String,String>(); 

    while(cursor.moveToNext()) { 
     h = new Hashtable<String,String>(); // <--THIS LINE HERE 
     h.put("name", cursor.getString(0)); 
     h.put("region", cursor.getString(1)); 
     h.put("_id", cursor.getString(2)); 

     v.addElement(h); 
    } 

をしかし、私は完全に理由を理解していない...

はハッシュテーブルへのポインタを維持するベクトルは...?

ありがとうございます。

答えて

1

は、whileループの各反復は、現在のカーソル位置の内容を同じHashtableを移入します。 2番目のコード例では、コンストラクタ(new Hashtable()の部分)を呼び出すと、毎回が異なるHashtableが各繰り返しに設定されます。

コレクションでは、すぐにはわからない方法でコレクションを変更することができます。私たちはこのプログラムを持っている想像してみて:

public static void main(String[] args) { 
    Set<String> set = new HashSet<>(); 
    set.add("hello"); 
    set.add("world"); 

    Vector<Set<String>> v = new Vector<>(); 
    v.add(set); 

    set.clear(); 

    System.out.println(v); 
} 

あなたは、これは次のように出力することを知って驚くかもしれません:

[[]] 

あなたはadd()VectorからSet、何もロック」に起こらないとき"その内容。 Setにさらに変更を加えると、Vectorにも影響します。

同様に、プログラムでは、最初のループ反復後に、Vectorは、Hashtableへの単一参照を最初のカーソル位置の内容で保持します。しかし、2回目の繰り返しが実行され、Hashtableの内容が上書きされ、もう一度add()の内容が上書きされます。 Vectorには2つの参照(同じHashtable)が格納され、それぞれは2番目のカーソル位置の内容を持ちます。

あなたwhileループが終了するまでこのパターンは、あなたのVectorはXの参照(同じHashtableに)、最後のカーソル位置の内容とそれぞれを持っています、その時点で、繰り返されます。

1

最初のコードブロックでは、同じオブジェクトを上書きしているだけなので、whileループを2回反復したとしましょう。最初のhインスタンスがname = "a"、region = "b"および_id = "c"を持つ場合、新しいインスタンスを作成しないので、次の繰り返しで、オブジェクトのname、regionおよび_idフィールドは次のようにオーバーライドされます。あなたがそれらに割り当てるどんな値でも。したがって、2つのアイテムがあり、両方とも属性の値が同じです。最初のコード例で

関連する問題