Co masz na myśli mówiąc „stanowisko”? HashMapy nie są uporządkowane, więc nie mają zwykłego pojęcia „pozycji”, które można uzyskać za pomocą czegoś takiego jak Vector.
Mat
1
Czy masz na myśli jego kolejność reklamową czy inną kolejność?
To naprawdę nie odpowiada na pytanie. Inne odpowiedzi poniżej są bardziej przydatne.
forresthopkinsa
6
Z całym szacunkiem cytuję dokumentację, która bezpośrednio odpowiada na pytanie
Wayne
1
Nawet jeśli kolejność nie jest stała w czasie, nadal istnieje możliwość pobrania jednego z członków na dane stanowisko.
Początkujący
Nie nadążam. Wyjaśnić?
Wayne,
Link HashMap jest uszkodzony / 404.
Raf
110
Użyj LinkedHashMap, a gdy chcesz pobrać według pozycji, przekonwertuj wartości na ArrayList.
LinkedHashMap<String,String> linkedHashMap =newLinkedHashMap<String,String>();/* Populate */
linkedHashMap.put("key0","value0");
linkedHashMap.put("key1","value1");
linkedHashMap.put("key2","value2");/* Get by position */int pos =1;String value =(newArrayList<String>(linkedHashMap.values())).get(pos);
Najprościej muszę powiedzieć ... Zamiast konwertować wszystko, używasz tylko zestawu kluczy. Znakomity
kirtan403
19
Jeśli z jakiegoś powodu musisz trzymać się hashMap, możesz przekonwertować zestaw kluczy na tablicę i zindeksować klucze w tablicy, aby uzyskać wartości z mapy w następujący sposób:
Implementacja tabeli skrótów i połączonych list interfejsu Map z przewidywalną kolejnością iteracji. Ta implementacja różni się od HashMap tym, że utrzymuje podwójnie połączoną listę obejmującą wszystkie jej wpisy.
Zakładam, że przez „pozycję” masz na myśli kolejność, w której wstawiłeś elementy do HashMap. W takim przypadku chcesz używać LinkedHashMap. Jednak LinkedHashMap nie oferuje metody dostępu; będziesz musiał napisać jedno polubienie
Innym działającym podejściem jest przekształcenie wartości mapy w tablicę, a następnie pobranie elementu w indeksie. Uruchomienie testowe 100 000 elementów przy wyszukiwaniu indeksu w LinkedHashMap obejmującym 100 000 obiektów przy użyciu następujących podejść doprowadziło do następujących wyników:
//My answer:publicParticle getElementByIndex(LinkedHashMap<Point,Particle> map,int index){return map.values().toArray(newParticle[map.values().size()])[index];}//68 965 ms//Syd Lambert's answer:publicParticle getElementByIndex(LinkedHashMap<Point,Particle> map,int index){return map.get((map.keySet().toArray())[ index ]);}//80 700 ms
Podsumowując, pobieranie elementu po indeksie z LinkedHashMap wydaje się być dość ciężką operacją.
HashMap - i podstawowa struktura danych - tabele skrótów, nie mają pojęcia pozycji. W przeciwieństwie do LinkedList lub Vector klucz wejściowy jest przekształcany w „zasobnik”, w którym przechowywana jest wartość. Te zasobniki nie są uporządkowane w sposób, który ma sens poza interfejsem HashMap i jako takie, elementy, które umieszczasz w HashMap nie są w takim sensie, jakiego można by się spodziewać po innych strukturach danych
HashMaps nie zezwala na dostęp według pozycji, wie tylko o kodzie skrótu i może pobrać wartość, jeśli może obliczyć kod skrótu klucza. TreeMaps ma pojęcie porządkowania. Mapy w serwisie Linkedhas zachowują kolejność, w jakiej zostały wprowadzone na mapę.
Odpowiedzi:
HashMapy nie zachowują kolejności:
Spójrz na LinkedHashMap , który gwarantuje przewidywalną kolejność iteracji.
źródło
Użyj LinkedHashMap, a gdy chcesz pobrać według pozycji, przekonwertuj wartości na ArrayList.
źródło
Jeśli chcesz zachować kolejność, w jakiej dodałeś elementy do mapy, użyj
LinkedHashMap
zamiast justHashMap
.Oto podejście, które pozwoli Ci uzyskać wartość na podstawie jej indeksu na mapie:
źródło
Jeśli z jakiegoś powodu musisz trzymać się hashMap, możesz przekonwertować zestaw kluczy na tablicę i zindeksować klucze w tablicy, aby uzyskać wartości z mapy w następujący sposób:
Możesz wtedy uzyskać dostęp do mapy, na przykład:
źródło
String myKey = keys[i].toString();
Zastosowanie
LinkedHashMap
:źródło
Użyj LinkedHashMap i użyj tej funkcji.
Zdefiniuj w ten sposób i.
Funkcja może zwrócić wybrany wpis.
źródło
Zakładam, że przez „pozycję” masz na myśli kolejność, w której wstawiłeś elementy do HashMap. W takim przypadku chcesz używać LinkedHashMap. Jednak LinkedHashMap nie oferuje metody dostępu; będziesz musiał napisać jedno polubienie
źródło
Innym działającym podejściem jest przekształcenie wartości mapy w tablicę, a następnie pobranie elementu w indeksie. Uruchomienie testowe 100 000 elementów przy wyszukiwaniu indeksu w LinkedHashMap obejmującym 100 000 obiektów przy użyciu następujących podejść doprowadziło do następujących wyników:
Podsumowując, pobieranie elementu po indeksie z LinkedHashMap wydaje się być dość ciężką operacją.
źródło
HashMap - i podstawowa struktura danych - tabele skrótów, nie mają pojęcia pozycji. W przeciwieństwie do LinkedList lub Vector klucz wejściowy jest przekształcany w „zasobnik”, w którym przechowywana jest wartość. Te zasobniki nie są uporządkowane w sposób, który ma sens poza interfejsem HashMap i jako takie, elementy, które umieszczasz w HashMap nie są w takim sensie, jakiego można by się spodziewać po innych strukturach danych
źródło
HashMap nie ma pojęcia pozycji, więc nie ma możliwości uzyskania obiektu według pozycji. Obiekty w Mapach są ustawiane i pobierane za pomocą kluczy.
źródło
możesz użyć poniższego kodu, aby uzyskać klucz:
String [] keys = (String[]) item.keySet().toArray(new String[0]);
i pobierz obiekt lub listę, która wstawia do HashMap z kluczem tego elementu:
item.get(keys[position]);
źródło
Domyślnie java LinkedHasMap nie obsługuje pobierania wartości według pozycji. Więc proponuję wybrać dostosowane
IndexedLinkedHashMap
Następnie możesz użyć tej dostosowanej LinkedHasMap jako
Aby dodać wartości
Aby uzyskać wartość według indeksu
źródło
HashMaps nie zezwala na dostęp według pozycji, wie tylko o kodzie skrótu i może pobrać wartość, jeśli może obliczyć kod skrótu klucza. TreeMaps ma pojęcie porządkowania. Mapy w serwisie Linkedhas zachowują kolejność, w jakiej zostały wprowadzone na mapę.
źródło
Możesz spróbować zaimplementować coś takiego, spójrz na:
Mam nadzieję, że to działa dla Ciebie.
źródło