2012-10-18 2 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() 메소드는 맵의 모든 키 세트를 제공합니다.

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)); 
} 

또한, 대한 루프 당신의 1은 나에게 이상한 보이는 : - 이전의 모든 값을 덮어 쓰게됩니다

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

당신은 당신의 목록을 반복하고, 같은 reference - map에 각 요소를 할당하는, .. 당신이해야 할 일은 목록의 마지막지도입니다.

편집 : -

당신이 당신의지도에 대한 키와 값 모두를 원하는 경우도 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 너무 늦게 대답 해 주셔서 죄송합니다. 질문을 게시 한 후에 기회가 있습니다. 무엇을 하려는지는지도에서 모든 값을 얻는 것입니다. 게시물에서 말했듯이 해시 맵에는 JSON 파싱을 통해 채워진 다음 ArrayList에 추가 된 두 개의 키가 있습니다. ArrayList 안에있는 HashMap의 2 키에 대한 모든 값을 검색하려고합니다. 네, 처음 "for"루프가 이상하게 보입니다. 하지만 해쉬 맵은 단지 2 개의 값만 반환하고 ArrayList에는 더 많은 정보가 있기 때문에 Arraylist의 모든 값을 얻으려고했습니다. – irobotxxx

1

루프의 끝 부분에 i ++ 어딘가에 넣으십시오.

위의 코드에서 배열의 0 위치는 각 루프에서 증가하지 않으므로 덮어 씁니다.

참고 : 아래는 중복 검색을하고있다 :

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

Downvoter가 관심을 가져 주시겠습니까? 위 코드에서 i가 증가하지 않기 때문에 배열의 0 위치를 덮어 씁니다. –

+0

그는 내가 선언 된 코드를 게시하지 않았습니다. 그것이 for-loop에 있다면 이미 증가하고있을 것입니다. 그는 'i'에 대해 아무 것도 게시하지 않았기 때문에 'i'로 무슨 일이 일어나고 있는지 모릅니다. – toadzky

+0

@toadzky 게시물을 다시 확인하십시오. 'int i = 0;'을 찾는다. 그는'i'가 선언 된 코드를 게시했습니다. –

9

시도해보세요.

나는 HashMap<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

이제 괜찮습니다. 그런데 왜 모든지도 값을 목록에 추가하고 있습니까? 정말 필요한가요? 나는 생각하지 않는다. 언제든지 가치를 원한다면 Map 자체에서 얻을 수 있습니다. 당분간 OP가하고자하는 것은 매우 불분명합니다. –

+0

@RohitJain OP가이 방법을 원했던 것처럼 ArrayList에 값을 추가했습니다. 질문의 제목이 말하는 것 .... –

1

이 믿을 수 없을만큼 오래는 HashMap값 유형 String 고려하고 있지만, 다른 질문에 대한 답을 찾기 위해 노력을 통해 나는 비틀 거렸다.

제 질문은 arraylist의 두 맵 키 값을 어떻게 구합니까?

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

지도의 크기는 언제나 요소

난 당신이 HashMap의 기능을 혼동 할 수있다 생각이다 2의 값을 반환합니다. HashMap은지도에서 관계 만 허용합니다. 예를 들어

당신이있는 경우 :

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

이 코드는 "BAR" 마지막 항목에서와 연관 될 수있는 주요 항목을 설정 끝날 것 :

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

하고 같은 것을 할 시도 목록 bars.

예제에서 두 항목 만 있다는 혼란스러워 보이지만 두 키를 기록하면 각 키의 필드를 여러 번 덮어 썼다고 믿을 수 있습니다. 나는 당신이 그것에 필요한 모든 항목을 추가 ValueDataType

HashMap<KeyDataType,ValueDataType> list; 

같은 주요 KeyDataType 같은 데이터 타입과 값의 데이터 형과 해시 맵이

0

가정하자. 이제 모든 해시 맵 키를 목록으로 다시 검색 할 수 있습니다.

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

그래서, 지금 당신은 당신은 당신이 두 맵에서 키를 원하는 경우

list.get(mkeys[position]);