2009-11-09 19 views
5

Wie konvertiert man am einfachsten ein 2D-Array von Strings in eine HashMap?statisches 2D-String-Array in HashMap konvertieren

Nehmen wir zum Beispiel diese:

 
final String[][] sheetMap = { /* XSD Name, XSL Sheet Name */ 
           {"FileHeader", "FileHeader"}, 
           {"AccountRecord", "AccountRecord"}, 
           {"DriverCardRecord", "DriverCardRecord"}, 
           {"AssetCardRecord", "AssetCardRecord"}, 
           {"SiteCardRecord", "SiteCardRecord"} 
          }; 

Dies wird höchstwahrscheinlich aus einer Datei geladen gehen werden und wird viel größer sein.

+0

ich wahrscheinlich, dass andere als nur Schleife durch die Elemente hinzufügen soll, was ich jetzt tue, ist es eine Sammlung Methode, die ich nur verwenden kann Übergeben Sie dieses 2D-Array an eine HashMap-Instanz? – Casey

+1

Nicht, dass ich mir dessen bewusst bin - und ich denke nicht, dass es möglich ist, etwas effizienteres als eine einfache Schleife über alle Array-Elemente zu implementieren. Sie würden also nichts über die Kürze hinaus gewinnen, was Sie noch einmal reproduzieren könnten, indem Sie dies in Ihre eigene 'Utils'-Klasse einordnen. –

Antwort

20
final Map<String, String> map = new HashMap<String, String>(sheetMap.length); 
for (String[] mapping : sheetMap) 
{ 
    map.put(mapping[0], mapping[1]); 
} 
+0

+1 ya schlugen mich durch Sekunden :-) –

+1

+1: Manchmal ist die einfachste Lösung = ist = die beste Lösung. – DivineWolfwood

4

Wenn Sie nur Ihre Karte auf bequeme Weise initialisieren möchten, können Sie double brace initialization verwenden:

Map<String, String > sheetMap = new HashMap<String, String >() {{ 
    put("FileHeader", "FileHeader"); 
    put("AccountRecord", "AccountRecord"); 
    put("DriverCardRecord", "DriverCardRecord"); 
    put("AssetCardRecord", "AssetCardRecord"); 
    put("SiteCardRecord", "SiteCardRecord"); 
}}; 
+0

Dies kann einige negative Auswirkungen haben und wird weithin als Anti-Pattern - https://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/ –

2

Warten; Wenn das aus einer Datei geladen wird, gehen Sie nicht durch den Intermediate-Array-Schritt! Sie müssten zuerst alles laden, bevor Sie das Array erstellen, oder Sie würden die Größe des Arrays nicht kennen. Erstellen Sie einfach eine HashMap und fügen Sie jeden Eintrag beim Lesen hinzu.

+0

Ja, das ist der Plan. Allerdings weiß ich nicht, wo die Informationen im Moment gespeichert werden, also habe ich sie einfach in das Array programmiert.Es stellte sich die Frage, ob das Collections-Framework bereits eine Utility-Methode zur Ausführung dieser Task enthielt, obwohl es einfach zu implementieren ist. Ich würde lieber eine Methode in den Sammlungen verwenden, wo immer es möglich ist. – Casey

+0

ah. Nun, ja, tut es nicht. Wenn dies der Fall wäre, würde es eine Sammlung von etwas akzeptieren, nicht ein Array. Vielleicht von Map.Entry's. Aber das ist nicht wirklich sehr nützlich. Schleifen ist besser. –

0

Die bestehenden Antworten funktionieren gut, natürlich, aber im Interesse der ständig diese Website mit neuen Informationen zu aktualisieren, hier ist ein Weg, um es in Java zu tun 8:

String[][] arr = {{"key", "val"}, {"key2", "val2"}}; 
HashMap<String, String> map = Arrays.stream(arr) 
     .collect(HashMap<String, String>::new, 
       (mp, ar) -> mp.put(ar[0], ar[1]), 
       HashMap<String, String>::putAll); 

Java 8 Stream s sind fantastisch, und ich ermutige Sie sie für detaillierte Informationen zu sehen, aber hier sind die Grundlagen für diese Operation:

  • Arrays.stream erhalten eine Stream<String[]> mit zu arbeiten.
  • collect nimmt Ihre Stream und reduziert es auf ein einzelnes Objekt, das alle Mitglieder sammelt. Es benötigt drei Funktionen. Die erste Funktion, der Lieferant, erzeugt eine neue Instanz eines Objekts, das die Mitglieder sammelt, also in unserem Fall nur die Standardmethode zum Erstellen einer HashMap. Die zweite Funktion, der Akkumulator, legt fest, wie ein Element der Stream in das Zielobjekt eingefügt wird. In unserem Fall möchten wir einfach den Schlüssel und den Wert, definiert als erster und zweiter Wert aus jedem Array, in die Karte einfügen. Die dritte Funktion, der Kombinierer, ist einer, der zwei der Zielobjekte kombinieren kann, falls aus irgendeinem Grund die JVM entschieden hat, den Akkumulationsschritt mit mehreren HashMaps (in diesem Fall oder einem anderen Zielobjekt in einem anderen Fall) auszuführen) und dann müssen sie zu einem kombiniert werden, was hauptsächlich für asynchrone Ausführung ist, obwohl das normalerweise nicht passieren wird.
1

Als etwas sauberere Alternative zu tradeJmark Antwort:

String[][] arr = // your two dimensional array 
Map<String, String> arrMap = Arrays.stream(arr).collect(Collectors.toMap(e -> e[0], e -> e[1])); 

// Sanity check! 
for (Entry<String, String> e : arrMap.entrySet()) { 
    System.out.println(e.getKey() + " : " + e.getValue()); 
}