2013-08-20 11 views
14

Okay, ho passato diverse ore a cercare di comprendere questo concetto di HashMap in Java, ma non sono in grado di capirlo. Ho esaminato molti tutorial ma nessuno sembra rispondere al mio esatto requisito e non riesco a farlo funzionare.L'array multidimensionale associativo HashMap di Java non può creare o aggiungere elementi

Sto cercando di creare un array multidimensionale associativo in Java (o qualcosa di simile) in modo che sia possibile salvare e recuperare dall'array con le chiavi che sono stringhe.

Questo è come vorrei farlo in PHP e spiega meglio quello che sto cercando di fare:

//loop one - assign the names 
myArray['en']['name'] = "english name"; 
myArray['fr']['name'] = "french name"; 
myArray['es']['name'] = "spanish name"; 

//loop two - assign the description 
myArray['en']['desc'] = "english description"; 
myArray['fr']['desc'] = "french description"; 
myArray['es']['desc'] = "spanish description"; 

//loop three - assign the keywords 
myArray['en']['keys'] = "english keywords"; 
myArray['fr']['keys'] = "french keywords"; 
myArray['es']['keys'] = "spanish keywords"; 

//later on in the code be able to retrive any value similar to this 
english_name = myArray['en']['name']; 
french_name = myArray['fr']['name']; 
spanish_name = myArray['es']['name']; 

Questo è quello che ho provato in Java, ma non funziona:

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

myArray.put("en" , put("name", "english name")); //gives me "cannot find symbol" at second put 

myArray.put("en" , ("name", "english name")); //gives me "')' expected" after second comma 

Quindi sono sicuro che sia qualcosa di semplice che mi manca ma per favore segnalalo perché è molto frustrante!

Grazie

EDIT:

ecco qualche codice di lavoro su come ho implementato la risposta ho accettato:

import java.util.*; 

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

String[] langArray = {"en","fr","de","no","es"}; 

//Initialize each language key ahead of time 
for(String lang : langArray) { // foreach lang in langArray 
    if (!finalArray.containsKey(lang)) { 
    finalArray.put(lang, new HashMap<String, String>()); 
    } 
} 

//loop one - assign names 
for(String lang : langArray) { 
    String theName = lang + " name"; //go get the name from somewhere 
    finalArray.get(lang).put("name", theName); 
} 

//loop two - assign description 
for(String lang : langArray) { 
    String theDesc = lang + " description"; //go get the description from somewhere 
    finalArray.get(lang).put("desc", theDesc); 
} 

//loop three - assign keywords 
for(String lang : langArray) { 
    String theKeys = lang + " keywords"; //go get the keywords from somewhere 
    finalArray.get(lang).put("keys", theKeys); 
} 

//display output 
for(String lang : langArray) { 
    System.out.println("LANGUAGE: " + lang); 
    System.out.println(finalArray.get(lang).get("name")); 
    System.out.println(finalArray.get(lang).get("desc")); 
    System.out.println(finalArray.get(lang).get("keys")); 
} 

//example to retrieve/get values 
String english_name = finalArray.get("en").get("name"); 
String french_desc = finalArray.get("fr").get("desc"); 
+0

Bene, dopo aver letto alcune risposte che vedo che non è così semplice! Grazie per le risposte! – jsherk

risposta

18
HashMap<String, HashMap<String, String>> myArray = new HashMap<String, HashMap<String, String>>(); 

if (!myArray.containsKey("en")) { 
    myArray.put("en", new HashMap<String, String>()); 
} 
myArray.get("en").put("name", "english name"); 

In Java è necessario essere espliciti su quando stai creando un oggetto. In questo caso per prima cosa controlliamo se esiste già un oggetto HashMap memorizzato nel nostro esterno HashMap sotto la chiave "en". In caso contrario, ne creiamo uno vuoto.

Ora per inserire un nuovo valore in esso dobbiamo prima ottenerlo dall'esterno HashMap, quindi inserire il nuovo valore.

+0

Ok questo funziona perfettamente per il mio caso d'uso. Posso quindi aggiungere 'name' e' desc' e 'keys' a ciascun tasto lingua in qualsiasi momento! Ho contrassegnato questo come corretto. – jsherk

2

Sfortunatamente, non esiste una sintassi concisa per la costruzione di mappe popolate in Java. Dovrai scriverlo a mano. Un metodo di supporto separato può rendere un po 'più semplice:

HashMap<String, String> makeMap(String name, String desc, String keys) { 
    HashMap<String, String> map = new HashMap<>(); 
    // Before Java 7, above must be: new HashMap<String, String>(); 
    map.put("name", name); 
    map.put("desc", desc); 
    map.put("keys", keys); 
} 

Poi:

HashMap<String, HashMap<String, String>> myArray = new HashMap<>(); 
myArray.put("en", 
    makeMap("english name", "english description", "english keywords")); 
// etc. 

Si potrebbe recuperarlo con:

english_name = myArray.get("en").get("name"); 
+0

Non sono sicuro che funzionerà poiché non li aggiungo tutti allo stesso tempo. Devo aggiungere il nome durante un ciclo, poi la desc in un altro ciclo e le chiavi di nuovo in un terzo ciclo. Ho aggiornato il mio esempio PHP sopra per illustrare meglio quello che sto cercando di fare. – jsherk

1
HashMap<String, HashMap<String, String>> myArray = new HashMap<String, HashMap<String, String>>(); 
HashMap<String, String> value = new HashMap<String, String>(); 
value.put("name", "English name"); 
value.put("desc", "English description"); 
value.put("keys", "English keywords"); 

myArray.put("en" , value); 

value = new HashMap<String, String>(); 
value.put("name", "French name"); 
value.put("desc", "French description"); 
value.put("keys", "French keywords"); 

myArray.put("fr" , value); 
+0

'name',' desc' e 'keys' non saranno assegnati allo stesso tempo, quindi questo non funziona per me. Vengono assegnati in loop diversi quindi non ho più "name" e non "desc" e solo "keys" a sinistra. Ho aggiornato il mio esempio PHP sopra per illustrare meglio quello che sto cercando di fare. – jsherk