2012-03-29 9 views
5

Próbuję powtórzyć tylko pierwsze wartości "n" w mojej Mapie, czy istnieje jakakolwiek dostępna metoda, czy też potrzebuję kontrolować ją tylko ze zmienną licznika.Jak pobrać pierwsze 10 par kluczy w HashMap

Poniżej znajduje się przykład, posortowałem grupę nazwisk należących do tego samego miasta. Teraz chcę tylko pierwsze 10 miasta i nazwiska osób w nim.

for (Map.Entry<String, List<String>> entry : map.entrySet()) { 
    List<String> list = entry.getValue(); 
    // Display list of people in City 
} 

Czy istnieje implementacja mapy, która może pomieścić ustaloną liczbę par klucz, wartość? Proszę uzyskać wskazówki.

Dzięki,

-Vijay Selvaraj

+2

Czy chcesz zapobiec dodaniu więcej niż 10 wpisów, czy chcesz wprowadzić 10 wpisów, czy chcesz dodać 10 pierwszych wpisów? Więcej szczegółów. –

+0

Mój cel to mieć 10 wpisów. Teraz robię to pełne, a następnie biorąc podzbiór całości. Ale mogę bardzo dobrze przestać, gdy osiągnę 10 wpisów. –

Odpowiedz

9

Jak pobrać pierwsze 10 par wartości klucza w HashMap

HashMapis unordered. To sprawia, że ​​pytanie jest źle postawione (chyba że przez "pierwszy" masz na myśli "arbitralny").

Jeśli chcesz konsekwentnie zamawiać klucze, musisz zmienić typ mapy na SortedMap, na przykład TreeMap.

Alternatywnie, jeśli chodzi o najstarsze elementy, na które się natknąłeś (tj. Te, które wstawiłeś jako pierwsze), odpowiedzią jest LinkedHashMap.

Co do otrzymania pierwszych elementów n, pętla z licznikiem to całkiem rozsądny sposób na zrobienie tego.

2
List<List<string>> list = new ArrayList<List<String>>(); 
for (Map.Entry<String, List<String>> entry : map.entrySet()) { 
    if (list.size() > 9) break; 
    list.add(entry.getValue()); 
} 
+1

OP stwierdził, że wie, jak to zrobić z zmienną licznika –

3

Próbuję iteracyjne tylko pierwszych "n" wartości w moim mapą, czy jest jakiś sposób lub dostępne i trzeba je kontrolować tylko ze zmienną licznika.

Najbliższy rzeczą, którą można znaleźć tylko przy użyciu standardowego API kolekcje (który nadal jest nieco gorsza niż zmiennej licznika IMO) jest następujące: można uniknąć

List<Map.Entry<String, List<String>> entryList = 
     new ArrayList<Map.Entry<String, List<String>>(map.entrySet()); 

for (Map.Entry<String, List<String>> entry : entryList.subList(0, 10)) { 
    List<String> list = entry.getValue(); 
    // Display list of people in City 
} 

długiego parametry typu albo za pomocą fantazyjnych diament z Java 7:

List<Map.Entry<String, List<String>> entryList = new ArrayList<>(map.entrySet()); 

lub za pomocą Iterowanie nad klawiszami i .get odpowiednie wartości.

+0

Wystarczy spojrzeć na zarówno Hashmap i Set, nie ma metody SubList, starają się powiedzieć nam, skąd to pochodzi? – Churk

+1

@Churk: Pochodzi z 'ArrayList', która została skonstruowana z zawartością' map.entrySet() '. – NPE

+0

@ aix map.entrySet() zwraca zestaw, a nie listę tabel – Churk