2012-10-18 18 views
25

こんにちは、これは今私を混乱させるようなものであり(脳の凍結!)、何か不足しているようです。私は、HashMapを設定するArrayListを持っています。今私はHashMapとarraylistを入れました。ArrayList内のHashMapキーからすべての値を取得するJava

Map.put(DATE, value1); 
Map.put(VALUE, value2); 

arraylist.put(Map); 

JSONを解析するので、arraylistのサイズが大きくなります。今私の質問は、arraylistの両方のマップキーから値を取得する方法ですか?私はこれを試した

if(!list.isEmpty()){ // list is an ArrayList 

      for(int k = 0; k < list.size(); k++){ 
       map = (HashMap)list.get(k); 
      } 

     } 

     Log.d(TAG, "map size is" + map.size()); 

     String [] keys = new String[map.size()]; 
     String [] date_value = new String[map.size()]; 

     String [] value_values = new String[map.size()]; 

     int i = 0; 
     Set entries = map.entrySet(); 
     Iterator iterator = entries.iterator(); 

     while(iterator.hasNext()){ 

      Map.Entry mapping = (Map.Entry)iterator.next(); 
      keys[i] = mapping.getKey().toString(); 
      date_value[i] = map.get(keys[i]); 

      if(keys[i].equals(DATE)){ 
       date_value[i] = map.get(keys[i]); 

      } else if(keys[i].equals(VALUE)){ 
       value_values[i] = map.get(keys[i]); 
      } 

        i++; 
       } 

しかし、私はすべての値を得るように見えることはできません。マップサイズは常に2の値を返します。これは単なる要素です。 ArrayListのMapキーからすべての値を取得するにはどうすればよいですか?ありがとう

+0

を呼び出すことによって、あなたは今、任意の値を取得することができ

配列mkeys []であなたのすべてのキーを得ました両方のマップから実際にキーを取得する必要があります。あなたのコードはリストの最後のマップからキーを取得します。 – toadzky

答えて

70

あなたは、あなたの仕事をするための何かを持っているときに、なぜホイールを再発明したいのですか? Map.keySet()メソッドは、マップ内のすべてのキーのSetを提供します。

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

for (String key: map.keySet()) { 
    System.out.println("key : " + key); 
    System.out.println("value : " + map.get(key)); 
} 

また、forループ、あなたの第一は、私には奇妙に見える: - すべての以前の値を上書きします

for(int k = 0; k < list.size(); k++){ 
      map = (HashMap)list.get(k); 
    } 

あなたはあなたのリストを反復処理し、同じreference - mapに各要素を割り当てています、あなたのリストに最後の地図があります。

EDIT: -

あなたがマップのキーと値の両方が必要な場合もentrySetを使用することができます。それはあなたのためのよりよい賭けでしょう: -

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

    for(Entry<String, Integer> entry: map.entrySet()) { 
     System.out.println(entry.getKey()); 
     System.out.println(entry.getValue()); 
    } 

P.S.: -
あなたのコードは、私に混乱しているように見えます。私はそのコードを別にしておき、あなたのdesignについてもう一度考えてみてください。今のところ、コードが立っているので、何をしようとしているのかを理解することは非常に困難です。

+2

ループ内のコードが 'get'を呼び出す場合、' entrySet'はマップ内の要素を反復するより良い方法です –

+0

@JohnBええ、この場合はむしろ良いでしょう。 –

+0

@RohitJainとても遅く返事して申し訳ありません、質問を投稿してからチャンスがあります。何をしようとしているのはマップからすべての値を得ることです。私が記事で述べたように、Hashmapには2つのキーがあり、JSON解析を行ってからArrayListに追加します。 ArrayList内にあるHashMapの2つのキーの値をすべて取得したいとします。はい、最初の "for"ループが奇妙に見えます。ハッシュマップは2つの値のサイズしか返さなかったので、Arraylistのすべての値を取得しようとしていましたが、ArrayListにはそれ以上のものがあります。 – irobotxxx

1

ループの最後にi ++を置いてください。

上記のコードでは、iが各ループで増分されないため、配列の0の位置が上書きされます。

FYI:以下は、冗長検索やっている:

if(keys[i].equals(DATE)){     
    date_value[i] = map.get(keys[i]);    
} else if(keys[i].equals(VALUE)){    
    value_values[i] = map.get(keys[i]);    
} 

if(keys[i].equals(DATE)){     
    date_value[i] = mapping.getValue(); 
} else if(keys[i].equals(VALUE)){    
    value_values[i] = mapping.getValue() 
} 

で別の問題を置き換えるあなたはdate_valuevalue_valuesためiを使用していることです。これは、配列にnull値を持たない場合を除き、無効です。

+0

コメントしますか?上記のコードでは、iがインクリメントされていないため、配列の0の位置が上書きされます。 –

+0

彼は私がどこに宣言されたコードを投稿しませんでした。それがfor-loopにある場合は、すでに増分されている可能性があります。彼は「私」について何も投稿していないので、あなたは「私」と何が起こっているのか分かりません。 – toadzky

+0

@toadzky投稿を再確認してください。 'int i = 0;'を探します。彼は 'i'が宣言されたコードを投稿しました。 –

9

この方法で試してください...

私はタイプStringキーHashMapHashMap<String,String>

HashMap<String,String> hmap = new HashMap<String,String>(); 

hmap.put("key1","Val1"); 
hmap.put("key2","Val2"); 

ArrayList<String> arList = new ArrayList<String>(); 

for(Map.Entry<String,String> map : hmap.entrySet()){ 

    arList.add(map.getValue()); 

} 
+0

@KumarVivekMitra ..もう一度、あなたの 'ArrayList'を見てください。 –

+0

うん、それは今うまい。しかし、なぜあなたの地図の値をすべてリストに追加していますか?それは本当に必要ですか?私は違うと思います。あなたが価値を望むときはいつでも、あなたはそれを地図自体から得ることができます。当面は、OPがやりたいことは非常に不明です。 –

+0

@RohitJain OPがこのようにしたいので、ArrayListの値を追加しました。質問の見出しには何が書かれていますか? –

1

を検討していますこれは非常に古いですが、私は別の質問への答えを見つけようと、それを偶然見つけ。

私の質問はどのようにarraylistの両方のマップキーから値を取得しますか?

for (String key : map.keyset()) { 
    list.add(key + "|" + map.get(key)); 
} 

地図のサイズは常に私はあなたがHashMapの機能によって混同されるかもしれないと思うだけの要素

である、2の値を返します。 HashMapは、マップ内の1から1の関係のみを許可します。例えば

お持ちの場合:

String TAG_FOO = "FOO"; 
String TAG_BAR = "BAR"; 

と、このような何かをしようとすると:

ArrayList<String> bars = ArrayList<>("bar","Bar","bAr","baR"); 
HashMap<String,String> map = new HashMap<>(); 
for (String bar : bars) { 
    map.put(TAG_BAR, bar); 
} 

このコードは、最終的なアイテムに関連付けられるキー入力"BAR"を設定することになりますリストbars

あなたの例では、2つの項目しかないと混乱しているように見えますが、2つのキーしか記録されていないため、各キーのフィールドを複数回上書きしたと考えられます。私はあなたがそれに必要なすべての項目を追加しValueDataType

HashMap<KeyDataType,ValueDataType> list; 

などの主要KeyDataType として、データ型と値のデータ型とHashMapを持って

0

とします。 これですべてのハッシュマップキーをリストに戻すことができます。

KeyDataType[] mKeys; 
mKeys=list.keySet().toArray(new KeyDataType[list.size()]); 

だから、今、あなたは、あなたは、あなたが両方のマップからキーを欠けている場合

list.get(mkeys[position]); 
関連する問題