2009-11-09 20 views
5

Jaki jest najłatwiejszy sposób przekonwertowania dwuwymiarowych macierzy na mapę HashMap?konwertowanie statycznego ciągu znaków 2D na HashMap

Na przykład, weźmy to:

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

to najprawdopodobniej będzie ładowany z pliku i będzie znacznie większe.

+0

chyba powinienem dodać, że inne niż po prostu zapętlenie poprzez elementy, które robię teraz, czy istnieje metoda Kolekcje można używać tylko do przekazać tę tablicę 2D do instancji HashMap? – Casey

+1

Nie jestem tego świadomy - i nie uważam, że to * możliwe * zaimplementowanie czegoś bardziej wydajnego niż prosta pętla nad wszystkimi elementami tablicy. Więc nie uzyskałbyś niczego ponad zwięzłość, którą możesz ponownie powielić, umieszczając to w twojej własnej klasie 'Utils'. –

Odpowiedz

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

+1 do pokonania mnie przez kilka sekund :-) –

+1

+1: Czasami najprostsze rozwiązanie = jest = najlepsze rozwiązanie. – DivineWolfwood

4

Jeśli chcesz tylko zainicjować swoją mapę w wygodny sposób można użyć 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

Może to mieć pewne negatywne konsekwencje i jest powszechnie uważane za anty-wzór - https://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/ –

2

Czekaj; jeśli to będzie ładowane z pliku, nie przechodź przez krok pośredniej macierzy! Musiałbyś najpierw załadować wszystko przed utworzeniem tablicy lub nie znałbyś rozmiaru tablicy. Po prostu utwórz HashMap i dodaj każdy wpis podczas czytania.

+0

Tak, to jest plan. Jednak nie wiem, gdzie informacje będą przechowywane w tym momencie, więc po prostu mocno zakodowałem je w tablicy.Pojawiło się pytanie, czy struktura kolekcji zawierała już metodę użyteczności do wykonania tego zadania, mimo że jest to łatwe do wdrożenia. Wolę używać metody w kolekcjach, gdzie tylko to możliwe. – Casey

+0

ah. Cóż, tak, nie ma. jeśli tak, to zaakceptuje kolekcję czegoś, a nie tablicę. Może z Map.Entry's. Ale nie jest to bardzo przydatne. Pętla jest lepsza. –

0

Istniejące odpowiedzi działa dobrze, oczywiście, ale w interesie ciągłej aktualizacji tej witryny z nową informacją, oto sposób to zrobić w 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 są niesamowite, i zachęcam do obejrzenia ich w celu uzyskania szczegółowych informacji, ale tutaj są podstawy do tego konkretnego działania:

  • Arrays.stream dostanie Stream<String[]> pracować.
  • collect przenosi Twój Stream i redukuje go do pojedynczego obiektu, który zbiera wszystkie elementy. Ma trzy funkcje. Pierwsza funkcja, dostawca, generuje nowe wystąpienie obiektu, który zbiera elementy, tak jak w naszym przypadku, tylko standardową metodę tworzenia HashMap. Druga funkcja, akumulator, określa, w jaki sposób włączyć element Stream do obiektu docelowego, w tym przypadku po prostu chcemy, aby put był klucz i wartość, zdefiniowane jako pierwsza i druga wartość z każdej tablicy, do mapy. Trzecia funkcja, łącznik, to taka, która może łączyć dwa obiekty docelowe, na wypadek, gdyby z jakiegokolwiek powodu JVM zdecydowała się wykonać krok akumulacji z wieloma sami (w tym przypadku lub jakimkolwiek innym obiektem docelowym w innym przypadku).), a następnie musi łączyć je w jeden, co jest głównie przeznaczone do wykonywania asynchronicznego, chociaż zazwyczaj nie ma miejsca.
1

Jako nieco czystszą alternatywą dla tradeJmark odpowiedź:

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()); 
} 
Powiązane problemy