2016-05-06 9 views
1

: Ich bin Mapping Hash und ich habe versucht, eine verschachtelte Hash-Karte der Klasse auf der einen Seite erstellt und eine andere Klasse zu erstellen, es zu rufen, also hier, wie mein Code wieWie erhalte ich einen verschachtelten Hash-Map-Wert, den ich von einer anderen Klasse zurückgegeben habe? Java

sieht
public class Hash { 
    private HashMap<String, HashMap<String, String>> wow = new HashMap<String, HashMap<String, String>>(); 

    public void SetHash(){ 
     wow.put("key", new HashMap<String, Object>()); 
     wow.get("key").put("key2", "val2"); 
    } 

    public HashMap GetMap(){ 
     return wow; 
    } 
} 

Und auf die andere Klasse, die die Hauptklasse ist es so sein wird:

public static void main(String[] args) { 
    Hash h = new Hash(); 
    h.SetHash(); 
    System.out.println(h.GetMap.get("key").get("key2")); 
} 

Aber wenn ich die zweite get legen, dann ist es ein Fehler, so dass ich bin mir nicht sicher, ob dies möglich ist, oder ob ich sollte eigentlich den Hash platzieren direkt an der Hauptklasse.

+0

Sie vermissen die Klammern auf dem Methodenaufruf 'GetMap()'. – Berger

+0

Die Standardbenennungskonvention wäre auch, Methodennamen zu starten, einschließlich Getter mit einem Kleinbuchstaben. Außerdem sollten Sie die Typargumente im Rückgabetyp des Getters nicht ausblenden. Es gibt einige Typprüfungen, die der Compiler nicht so machen kann und auch das zweite 'get' wird nicht funktionieren, wenn Sie dies nicht tun (selbst nach dem Fixieren des Methodenaufrufs, wie von Berger erwähnt), da der Compiler nicht weiß Der Werttyp der Map ist eine Map. – fabian

+0

Sie sollten auch vermeiden, die generischen Typen einer Sammlung doppelt auf die rechte Seite des Ausdrucks zu verweisen. Verwenden Sie stattdessen einen leeren Diamantoperator: 'private HashMap > wow = neue HashMap <>();' – Lefteris008

Antwort

5

GetMap ist eine Methode, kein Attribut, so haben Sie es verweisen mit Klammer ():

h.GetMap().get("key") 

Nun zweiten Fehler. Ihre Map<String, Map<String, String> genannt wow eine Werte enthält, die Objekte vom Typ sind Map<String, String> so, bevor das erhalten, müssen Sie die Karte erhalten:

Map<String, String> m = (HashMap<String, String>) h.GetMap().get("key"); 

Und dann können Sie ausdrucken:

System.out.println(m.get("key2")); 

Wenn Sie eine ONELINER wollen (ist nicht wirklich klar, aber überprüfen Sie die Erklärung in den Kommentaren):

System.out.println(((HashMap<String, String>) h.GetMap().get("key")).get("key2")); 
//     ↑ casting parenthesis ↑ (
//     ↑ this say group IS a map and allow get()  ↑ 
//    ↑ system.out.println parenthesis        ↑ 

HINWEIS: Änderung auch diese Erklärung

wow.put("key", new HashMap<String, Object>()); 

von

wow.put("key", new HashMap<String, String>()); 

FINAL Code:

public class Q37066776 { 
    public static void main(String[] args) { 
     Hash h = new Hash(); 
     h.SetHash(); 
     Map<String, String> m = (HashMap<String, String>) h.GetMap().get("key"); 
     System.out.println(m.get("key2")); 
    } 

} 

class Hash { 
    private HashMap<String, HashMap<String, String>> wow = new HashMap<String, HashMap<String, String>>(); 

    public void SetHash() { 
     wow.put("key", new HashMap<String, String>()); 
     wow.get("key").put("key2", "val2"); 
    } 

    public HashMap GetMap() { 
     return wow; 
    } 
} 

WORKING ONLINE DEMO



aber man kann immer besser

tun!: =)

Wie Andrew

  • darauf können Sie Rückkehr des Verfahrens ändern,

Aber auch viele andere Dinge wie:

  • mit weniger konkrete Objekte (Map anstelle von HashMap)
  • Folgekonventionen (GetMap() wäre getMap())
  • Make Hash eine static Klasse mit static Block

Wenn ich Rewrite Code hätte, würde mein Ergebnis so aussehen:

public class Q37066776 { 
    public static void main(String[] args) { 
     System.out.println(Hash.getMap().get("key").get("key2")); 
    } 

} 

class Hash { 
    private static Map<String, Map<String, String>> wow = new HashMap<String, Map<String, String>>(); 

    static { 
     wow.put("key", new HashMap<String, String>()); 
     wow.get("key").put("key2", "val2"); 
    } 

    public static Map<String, Map<String, String>> getMap() { 
     return wow; 
    } 
} 
+0

Sie können 'GetMap()' als Rückgabe eines 'HashMap ', anstatt einen rohen Typ zu erzeugen. Dadurch werden die Kompilierungswarnungen zur Verwendung eines Rohtyps ebenfalls entfernt. –

+0

nicht wirklich, können Sie 'GetMap()' erklären, möglicherweise 'Map >' –

+0

@AndrewWilliamson Bitte überprüfen Sie bitte meine letzte Aktualisierung –

1

Sie haben 3 Fehler:

  1. GetMap ist eine Methode - Sie müssen GetMap() schreiben.
  2. erklären Sie die innere Karte als HashMap<String, String> - Sie die innere Karte nicht initialisiert werden können: wow.put("key", new HashMap<String, Object>()); ändert es zu wow.put("key", new HashMap<String, String>());
  3. Um die inneren Landkarte von der Haupt zugreifen - Sie den Rückgabewert von GetMap erklären muss Map<String, HashMap<String, String>> sein anstatt nur Rohtyp. Andernfalls weiß die äußere Klasse nicht, dass der äußere Kartenwert auch eine Hash-Map ist.

Statt verschachtelte Karten zu verwenden, sollten Sie die Google-Guava Tabelle verwenden: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Table.html