2016-07-22 15 views
-1

Ich versuche, Werte von einer verschachtelten Hash-Map abhängig von der Benutzerauswahl abzurufen. Ich habe Probleme, die Werte aus der verschachtelten Hashmap abzurufen.Abrufen von Werten aus geschachtelter HashMap von Benutzereingabe

Ich habe die HashMap wie diese

erstellt
private Map<String, Map<String, String>> contentTypesMap = new HashMap<String, Map<String, String>>(); 

Wenn der Benutzer MDX wählt i an die verschachtelten HashMap gehen wollen und die beiden String-Werte in der zweiten hashmap erhalten.

contentTypesMap.put("MDX", new HashMap<String,String>()).put("HELLO1", "FOO"); 

Und das ist meine Funktion für wo hashmap verwenden,

public void getDatabaseSelectionValues(){ 
    resourceType = (String) FileUtilityScreen.contentTypes.getSelectedItem(); 
    sqlTableName = contentTypesMap.get(resourceType).get(key); 
    languageSelected = FileUtilityScreen.languagesFromDataBase.get(
    FileUtilityScreen.languageDropDown.getSelectedItem()); 
} 
+0

'HashMap # put' returns == >>" der vorherige Wert, der dem Schlüssel zugeordnet ist, oder null, wenn keine Zuordnung für den Schlüssel vorhanden ist. (Eine Nullrückgabe kann auch anzeigen, dass die Zuordnung zuvor mit dem Schlüssel null verknüpft war).) " –

Antwort

0

mit Ihrem exemple, wenn die Auswahl "MDX" ist, können Sie Ihre zweite Karte erhalten, indem tun HashMap<String,String> selection = contentTypesMap.get("MDX")

dann Sie können die Methode entrySet() verwenden, um alle Einträge Ihrer Map abzurufen und über Einträge zu iterieren.

0

Soll der HELLO1 und FOO der Wert für MDX sein?

Sie sind nicht richtig. Versuchen Sie dies:

Ich würde auch überlegen, diese äußere Karte in einem eigenen Objekt zu wickeln, da es komplex werden kann.

+0

Ja, wenn Sie Hell1 und FOO als Dummy-Daten für die HashMap verwenden, könnten Sie bitte klären, dass die äußere Map in ein eigenes Objekt eingeschlossen wird. –

+0

@Chris put-Methode gibt einen String zurück, so dass Sie diesen nicht mit Map des Typs > –

+0

Oh yeah, ich fühle mich blöd für das Putten. Das erste von den zwei Dingen, die ich gepostet habe, sollte funktionieren. Wird es jetzt bearbeiten. – Chris

0

Lesen Sie die Dokumentation von Map.put (K-Taste, V-Wert)

@return dem vorherigen Wert mit Schlüssel zugeordnet ist, oder null, wenn keine Zuordnung für Schlüssel

war so Der Aufruf contentTypesMap.put("MDX", new HashMap<String,String>()) wird immer den Wert zurückgeben, der nicht mehr in der contentTypesMap Karte ist.

Lösung:

HashMap<String, String> map = contentTypesMap.get("MDX"); 
if (map == null) { 
    map = new HashMap<>(); 
    contentTypesMap.put("MDX", map); 
} 
map.put("HELLO1", "FOO"); 

Oder Sie Guave Multimap stattdessen verwenden können.

0

Was ich mit einer Wrapper-Klasse in meinem Kommentar oben meinte, war etwas in dieser Richtung, um es lesbarer zu machen. Ich gehe davon aus, dass der Schlüssel in der äußeren Map der Tabellenname ist und in der inneren Map der Spaltenname und der Datentyp für diese Spalte.

public class DatabaseTables { 

    private Map<String, Map<String, String>> dbTables = new HashMap<String, Map<String, String>>(); 

    public void addColumn(String tableName, String column, String type){ 
     Map<String, String> columns = dbTables.get(tableName); 

     if(dbTables.get(tableName) == null) { 
      columns = new HashMap<String, String>(); 
     } 

     columns.put(column, type); 
     dbTables.put(tableName, columns); 
    } 

    public Map<String,String> getColumnsForTable(String tableName){ 
     return dbTables.get(tableName); 
    } 
} 

Das fühlt sich immer noch hässlich an. Ich denke, eine bessere Lösung als diese wäre eine Klasse namens Table mit einer String-Eigenschaft für den Tabellennamen und einer Map für ihre Spalten und Datentypen.

Und dann, wo anders, könnten Sie eine Liste oder einen Satz vom Typ Tabelle haben.

Bearbeiten: Oder in Table.java, anstatt eine Zuordnung für die Spalten, könnten Sie eine Liste oder einen Satz vom Typ Spalte haben. Erstellen Sie dann eine Spaltenklasse mit zwei Feldern, eins für den Spaltennamen und das andere für den Typ.

Verwandte Themen