2012-10-18 14 views
25

Buona giornata, questo è un po 'come confondermi ora (congelamento del cervello!) E sembra che manchi qualcosa. Avere un ArrayList che popolino con una HashMap. ora ho inserito la mia HashMap e l'arraylist.Recupera tutti i valori dalle chiavi HashMap in un ArrayList Java

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

arraylist.put(Map); 

Poiché sto analizzando un JSON, l'arraylist aumenta di dimensioni significative. ora la mia domanda è come si ottengono i valori di entrambe le chiavi della mappa nell'arrayist? ho provato questo

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

Ma non riesco a ottenere tutti i valori. la dimensione della mappa restituisce sempre un valore di 2, che è solo gli elementi. come posso ottenere tutti i valori dalle chiavi della mappa in ArrayList? Grazie

+0

se si vogliono le chiavi da entrambe le mappe, è sarà necessario ottenere effettivamente le chiavi da entrambe le mappe. il tuo codice ottiene solo le chiavi dall'ultima mappa nell'elenco. – toadzky

risposta

70

Perché vuoi re-inventare la ruota, quando hai già qualcosa da fare per il tuo lavoro. Il metodo Map.keySet() ti fornisce un insieme di tutte le chiavi nella mappa.

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

Inoltre, il 1 ° ciclo for sembra strano per me: -

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

Si effettua l'iterazione vostra lista, e assegnando ogni elemento allo stesso reference - map, che sovrascriverà tutti i valori precedenti .. Tutto quello che avrai è l'ultima mappa nella tua lista.

EDIT: -

È inoltre possibile utilizzare entrySet se si vuole sia chiave e il valore per la mappa. Sarebbe scommessa migliore per voi: -

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.: -
Il tuo codice sembra confuso con me. Vorrei suggerire, tenere da parte il codice, e pensare al tuo design ancora una volta. Per ora, poiché il codice è valido, è molto difficile capire cosa stia cercando di fare.

+2

'entrySet' è un modo migliore per iterare gli elementi in una mappa se il codice nel ciclo chiama' get' –

+0

@JohnB Sì, che è meglio in questo caso piuttosto .. –

+0

@RohitJain scusa per aver risposto così tardi, didn ' Ho una possibilità dopo aver postato la domanda. quello che sto cercando di fare è ottenere tutti i valori dalla mappa. Come ho detto nel post, Hashmap ha 2 chiavi che vengono popolate attraverso un parsing JSON e quindi aggiunte a un ArrayList. Voglio recuperare tutti i valori per le 2 chiavi in ​​HashMap, che si trova all'interno di ArrayList. Sì, so che il primo ciclo "per" sembra strano. ma stavo cercando di ottenere tutti i valori nell'arrayylist perché Hashmap restituiva solo una dimensione di 2 valori e ce ne sono altri in ArrayList. – irobotxxx

1

Inserire i ++ da qualche parte alla fine del ciclo.

Nel codice precedente, la posizione 0 dell'array viene sovrascritta perché i non viene incrementato in ciascun ciclo.

FYI: il sotto sta facendo una ricerca ridondante:

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

sostituirli con

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

Un altro problema è che si sta utilizzando per idate_value e value_values. Questo non è valido a meno che non si intenda avere valori nulli nell'array.

+0

La cura di Downfer è un commento? nel codice precedente, la posizione 0 dell'array viene sovrascritta perché i non viene incrementato. –

+0

non ha inserito il codice dove è stato dichiarato. se è in un ciclo for, probabilmente è già in fase di incremento. non sai cosa sta succedendo con "io" perché non ha pubblicato nulla su "io". – toadzky

+0

@toadzky ricontrolla il messaggio per favore. Cerca 'int i = 0;'. Ha pubblicato il codice dove è stato dichiarato 'i'. –

9

Provalo in questo modo ...

sto considerando l'HashMap con chiave e valore di tipo String, 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 .. Dai un'occhiata al tuo 'ArrayList' ancora una volta .. –

+0

Sì, va bene ora. Ma perché stai aggiungendo tutti i valori della tua mappa in un elenco? È davvero necessario? Penso che nessuno. Ogni volta che vuoi un valore, puoi ottenerlo dalla Mappa stessa. Per ora non è chiaro quale OP desideri fare. –

+0

@RohitJain Ho aggiunto il valore in ArrayList come l'OP voleva in questo modo..e questo è l'intestazione della domanda .... –

1

Questo è incredibilmente vecchio, ma mi sono imbattuto in essa cercando di trovare una risposta a una domanda diversa.

la mia domanda è come si ottengono i valori da entrambe le chiavi della mappa nell'arrayist?

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

la dimensione della mappa restituire sempre un valore pari a 2, che si trova proprio gli elementi

penso che si può essere confusi dalla funzionalità di HashMap. HashMap consente solo le relazioni da 1 a 1 nella mappa.

Per esempio se si dispone di:

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

e tentare di fare qualcosa del genere:

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

Questo codice finirà per impostare la voce chiave "BAR" da associare con l'elemento finale l'elenco bars.

Nel tuo esempio ti sembra confuso che ci siano solo due voci, ma hai solo due chiavi registrate che mi portano a credere che hai semplicemente sovrascritto il campo di ogni chiave più volte.

0

Supponiamo che io ho hashmap con tipo di dati chiave come KeyDataType e il valore di tipo di dati come ValueDataType

HashMap<KeyDataType,ValueDataType> list; 

Aggiungi tutti gli elementi che si aveva bisogno di esso. Ora puoi recuperare tutte le chiavi di hashmap in una lista per.

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

Così, ora avete ottenuto i vostri tutte le chiavi in ​​un array mkeys []

è ora possibile recuperare qualsiasi valore chiamando

list.get(mkeys[position]); 
Problemi correlati