Czy istnieje elegancki sposób uzyskania tylko jednego Entry<K,V>
z HashMap, bez iteracji, jeśli klucz nie jest znany.
Ponieważ kolejność wpisów nie jest ważna, możemy powiedzieć coś takiego
hashMapObject.get(zeroth_index);
Chociaż mam świadomość, że nie ma takiej metody get by index.
Gdybym spróbował podejścia wspomnianego poniżej, nadal musiałby uzyskać cały zestaw wejściowy hasmapy .
for(Map.Entry<String, String> entry : MapObj.entrySet()) {
return entry;
}
Sugestie są mile widziane.
EDYCJA: Proszę zaproponować inną strukturę danych, aby była wystarczająca.
java
collections
nilesh
źródło
źródło
firstEntry()
metoda nie jest zdefiniowana w interfejsie,SortedMap
ale tylko wTreeMap
andConcurrentSkipListMap
:(SortedMap
dlatego, że miałfirstKey()
metodę.Mapy nie są uporządkowane, więc nie ma czegoś takiego jak „pierwszy wpis” i dlatego też nie ma metody get-by-index na
Map
(lubHashMap
).Możesz to zrobić:
(Uwaga: pominięto sprawdzanie pustej mapy).
Twój kod nie pobiera wszystkich wpisów na mapie, zwraca natychmiast (i przerywa pętlę) z pierwszym znalezionym wpisem.
Aby wydrukować klucz i wartość tego pierwszego elementu:
Uwaga: wywołanie
iterator()
nie oznacza, że iterujesz po całej mapie.źródło
LinkedHashMap
utrzymuje klucze w kolejności, w jakiej zostały włożone.Map
implementacje, takie jakLinkedHashMap
iTreeMap
mają zdefiniowaną kolejność. (HashMap
nie).Myślę, że iterator może być najprostszym rozwiązaniem.
Inne rozwiązanie (niezbyt ładne):
Albo jeszcze (nie lepiej):
źródło
Pobierz wartości, przekonwertuj je na tablicę, pobierz pierwszy element tablicy:
W.
źródło
Dlaczego chcesz uniknąć nazywania
entrySet()
go generalnie nie tworzy całkowicie nowego obiektu z własnym kontekstem, ale zamiast tego po prostu zapewnia obiekt fasady. Mówiąc najprościej,entrySet()
jest to dość tania operacja.źródło
Jeśli korzystasz z Java 8, jest to tak proste, jak findFirst () :
Szybki przykład:
źródło
Jeśli naprawdę chcesz zaproponowanego interfejsu API, możesz na przykład podklasę HashMap i śledzić klucze na liście. Nie widzisz w tym sensu, ale daje ci to, czego chcesz. Jeśli wyjaśnisz zamierzony przypadek użycia, być może znajdziemy lepsze rozwiązanie.
EDYCJA: celowo nie zagłębiłem się w ogólną stronę tego ...
źródło
Co masz na myśli mówiąc „bez iteracji”?
Możesz używać
map.entrySet().iterator().next()
i nie będziesz iterować po mapie (w znaczeniu „dotykania każdego obiektu”). Nie możesz jednak zdobyć tegoEntry<K, V>
bez użycia iteratora. Javadoc z Map.Entry mówi:Czy możesz wyjaśnić bardziej szczegółowo, co próbujesz osiągnąć? Jeśli chcesz najpierw obsłużyć obiekty, które pasują do określonego kryterium (np. „Mieć określony klucz”), aw przeciwnym razie wrócić do pozostałych obiektów, spójrz na PriorityQueue . Porządkuje Twoje obiekty w oparciu o naturalną kolejność lub niestandardową definicję
Comparator
, którą podasz.źródło
To podejście nie działa, ponieważ użyłeś HashMap. Zakładam, że użycie LinkedHashMap będzie w tym przypadku właściwym rozwiązaniem.
źródło
Pozwoliłoby to uzyskać pojedynczy wpis z mapy, który jest tak blisko, jak można, biorąc pod uwagę „pierwszy”, tak naprawdę nie ma zastosowania.
źródło
Natknąłem się tutaj, szukając tego samego ... Wtedy przypomniałem sobie
Iterables
klasę z biblioteki Guava .Aby uzyskać „pierwszy” elementu:
Iterables.getFirst( someMap.values(), null );
.Zasadniczo robi to samo co
Map.values().iterator().next()
, ale pozwala również określić wartość domyślną (w tym przypadku wartość null), jeśli na mapie nie ma nic.Iterables.getLast( someMap.values(), null );
zwraca ostatni element w Map.Iterables.get( someMap.values(), 7, null );
zwraca 7. element w Map, jeśli istnieje, w przeciwnym razie wartość domyślną (w tym przypadku null).Pamiętaj jednak, że HashMapy nie są zamawiane ... więc nie spodziewaj
Iterables.getFirst
się, że zwrócisz pierwszy przedmiot, który tam wrzuciłeś ... podobnieIterables.getLast
. Być może warto się z odwzorowaną jakość, choć.Może nie warto dodawać biblioteki Guava tylko w tym celu, ale jeśli zdarzy ci się używać innych fajnych narzędzi w tej bibliotece ...
źródło
Po twojej EDYCJI, oto moja sugestia:
Jeśli masz tylko jeden wpis, możesz zastąpić Mapę podwójnym obiektem. W zależności od rodzaju i Twoich preferencji:
źródło
źródło
Mam odpowiedź: (to proste)
Weź ArrayList, a następnie rzuć i znajdź rozmiar arraylist. Oto ona:
Pokaże rozmiar. (Podaj sugestię). To działa.
źródło