2009-11-09 24 views
5

Qual è il modo più semplice per convertire un array 2D di stringhe in una HashMap?conversione di array di stringhe 2D statiche in HashMap

Per esempio, prendete questo:

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

Questo è più probabile che a essere caricato da un file e sarà molto più grande.

+0

forse dovrei aggiungere che diversi dal semplice loop attraverso gli elementi, che sto facendo ora, c'è un metodo Collezioni posso usare solo per passare questo array 2D in un'istanza di HashMap? – Casey

+1

Non che io ne sia a conoscenza - e non penso sia * possibile * implementare qualcosa di più efficiente di un semplice ciclo su tutti gli elementi dell'array. Quindi non otterresti nulla di più di una brevità, che potresti duplicare di nuovo mettendola nella tua classe di tipo 'Utils'. –

risposta

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

+1 mi hai battuto per pochi secondi :-) –

+1

+1: A volte la soluzione più semplice = è la soluzione migliore. – DivineWolfwood

4

Se si desidera solo per inizializzare il mappa in un modo conveniente, è possibile utilizzare double brace initialization:

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

Questo può avere alcune conseguenze negative ed è ampiamente considerato un anti-pattern - https://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/ –

2

Attendere; se questo verrà caricato da un file, non effettuare il passaggio attraverso il passo della matrice intermedia! Dovresti caricare tutto prima prima di creare l'array o non conoscere la dimensione dell'array. Basta creare una HashMap e aggiungere ogni voce mentre la leggi.

+0

Sì, questo è il piano. Tuttavia, non so dove verranno archiviate le informazioni al momento, quindi l'ho semplicemente codificato nell'array.Ha fatto sorgere la domanda se il framework Collections contenesse già un metodo di utilità per svolgere questa attività, anche se è banale da implementare. Preferirei usare un metodo nelle collezioni laddove possibile. – Casey

+0

ah. beh, sì, non è così. se lo facesse, accetterebbe una Raccolta di qualcosa, non una matrice. Forse di Map.Entry. Ma questo non è davvero molto utile. Fare il ciclo è meglio. –

0

Le risposte esistenti funzionano bene, naturalmente, ma nell'interesse di aggiornare costantemente il sito con nuove informazioni, ecco un modo per farlo in Java 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 sono impressionanti, e vi incoraggio a guardare in su per informazioni più dettagliate, ma qui ci sono le basi per questa particolare operazione:

  • Arrays.stream otterrà un Stream<String[]> con cui lavorare.
  • collect prende il tuo Stream e lo riduce a un singolo oggetto che raccoglie tutti i membri. Ci vogliono tre funzioni. La prima funzione, il fornitore, genera una nuova istanza di un oggetto che raccoglie i membri, quindi nel nostro caso, solo il metodo standard per creare un HashMap. La seconda funzione, l'accumulatore, definisce come includere un membro dello Stream nell'oggetto di destinazione, nel tuo caso vogliamo semplicemente put la chiave e il valore, definiti come il primo e il secondo valore da ciascun array, nella mappa. La terza funzione, il combinatore, è quella che può combinare due degli oggetti di destinazione, nel caso, per qualsiasi motivo, la JVM ha deciso di eseguire la fase di accumulazione con più HashMap s (in questo caso, o qualunque altro oggetto di destinazione in un altro caso) e quindi ha bisogno di combinarli in uno, che è principalmente per l'esecuzione asincrona, anche se in genere ciò non accadrà.
1

Come alternativa un po 'più pulito per tradeJmark risposta:

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()); 
} 
Problemi correlati