2013-04-08 13 views
5

Jak przekonwertować Map<K, V> na listy List<K> keys, List<V> values, tak, aby zamówienie w keys i values było zgodne? Mogę tylko znaleźć Set<K> Map#keySet() i Collection<V> Map#values() które mogę przekonwertować do list przy użyciu:Jak przekonwertować mapę <K, V> na dwie listy przy zachowaniu zamówienia?

List<String> keys = new ArrayList<String>(map.keySet()); 
List<String> values = new ArrayList<String>(map.values()); 

ale martwię się, że kolejność będzie przypadkowa.

Czy to prawda, że ​​muszę je ręcznie przekonwertować lub czy jest gdzieś skrót?

Aktualizacja: Dzięki odpowiedziach udało mi się znaleźć dodatkowe, użyteczne informacje, które chciałbym podzielić się z wami, przypadkowy użytkownik google: How to efficiently iterate over each Entry in a Map?

+0

myślę ArrayList zachowuje kolejność, w jakiej możemy wstawić. –

+2

@AchintyaJha tak, to prawda. Jednak czy zbiór jest zwracany przez zamawianą mapę? –

+0

+1 za nieprzyjęcie założenia, że ​​dwie kolekcje (klucze i wartości) będą miały tę samą kolejność. – yshavit

Odpowiedz

10

Zastosowanie Map.entrySet():

List<String> keys = new ArrayList<>(map.size()); 
List<String> values = new ArrayList<>(map.size()); 
for(Map.Entry<String, String> entry: map.entrySet()) { 
    keys.add(entry.getKey()); 
    values.add(entry.getValue()); 
} 
+0

+1, ale przejdźmy do wersji Java 1.5 i użyj generycznych. W końcu Java 1.8 jest tuż za rogiem. – yshavit

+0

Całkowicie się zgadzam - po prostu nie używałem IDE, a ich poprawne wykonanie może być trudne bez tego. – rongenre

+1

Edytowane w celu odzwierciedlenia generics języka Java 7. –

1

Należy wyodrębnić listę kluczy, jak wspomniano, a następnie iteracyjne nad nimi i wyodrębnić wartości:

List<String keys = new ArrayList<String>(map.keySet()); 
List<String> values = new ArrayList<String>(); 
for(String key: keys) { 
    values.add(map.get(key)); 
} 
+1

Można również iterować nad 'entrySet', aby uzyskać zarówno klucze, jak i wartości. –

+0

To prawda - złożoność jest taka sama. – Avi

1

Należy pamiętać, że mapa nie jest uporządkowana kolekcja. Kolejność iteracji nie jest ustalona. Kiedy dodasz więcej wpisów do swojej mapy, pojawią się one w losowych punktach w iteracji, przez co nie będą już pasować do twoich list.

Jeśli potrzebujesz kolejność iteracji mapą być taka sama jak kolejność wkładania niż spojrzeć LinkedHashMap

+0

Nie dbam o porządek, z tym wyjątkiem, że potrzebuję pary (klucz, wartość) w tej samej "pozycji" na dwóch wynikowych listach. –

+0

Czy to nie robi "iterator"? To prawda, nie możesz mieć pewności, w jakiej kolejności jest mapa, ale możesz upewnić się, że podczas iteracji za pomocą 'entrySet' iterator' Iterator' iteruje w określonej kolejności. – GameDroids

+0

@MichaWiedenmann: cóż, nie musisz się martwić, umieszczając wartości na twoich listach. Zachowaj szczególną ostrożność, zmieniając listy później. – GameDroids

Powiązane problemy