2016-02-25 26 views
5

W języku Java, TreeMap<K,V> używa drzewa RB do przechowywania wpisów, umożliwiając iterację w kolejności przy użyciu map.entrySet().iterator(), gwarantując jednocześnie wstawienie i wyszukiwanie w log (N) czasie.Java: iterator z wpisu TreeMap?

TreeMap zapewnia również metody wyszukiwania górnych i dolnych granic dla danego klucza: map.floorEntry(k), map.ceilingEntry(), map.lowerEntry(k) i map.higherEntry(). Jednak wartość zwracana z nich to instancja Map.Entry<K,V> i nie zezwala ona bezpośrednio na odwiedzanie sąsiednich wpisów. Chciałem odwiedzić potencjalnych sąsiadów hipotetycznego wpisu, biorąc pod uwagę jego klucz.

Czy istnieje sposób, aby uzyskać iterator z wpisu TreeMap lub zrobić to, co próbuję zrobić?

są bardziej przyzwyczajeni do C++ 's std::map<K,V> klasie, jestem w rozterce tutaj ...

UWAGA Jestem otwarty na rozwiązania przy użyciu biblioteki kontenera innego niż java.util na tak długo, jak to ma posortowany pojemnik mapy z pewnymi gwarancjami złożoności czasowej.

Odpowiedz

2

Możesz wziąć klucz zwrócony Map.Entry<K, V> jako parametr w tailMap(K fromKey) lub headMap(K toKey) i powtórzyć wynik.

+0

To prawie to, czego szukam; jednak biorąc pod uwagę, że chcę uzyskać oba wpisy, które są tuż przed i zaraz po danym kluczem, musiałbym wywołać obie metody, co oznacza dwa wyszukiwania, które wydają się marnowaniem cykli procesora. – Shadocko

+0

OK, przepraszam, że źle zrozumiałem twoją odpowiedź, oczywiście miałeś na myśli 'map.tailMap (map.lowerEntry (k) .getKey())'. To by działało, ale nadal wymaga 2 wyszukiwań. – Shadocko

+0

Kolejne rozwiązanie - stworzyłeś własny iterator mapy drzewa dla swoich potrzeb, ale nie jest to łatwe zadanie – Eva