Jestem zdumiony, że nie mogę znaleźć szybkiej odpowiedzi na to pytanie. Zasadniczo szukam infrastruktury danych w Javie, która implementuje java.util.List
interfejs, ale która przechowuje swoje elementy w posortowanej kolejności. Wiem, że możesz używać normalnego ArrayList
i używać Collections.sort()
na nim, ale mam scenariusz, w którym od czasu do czasu dodam i często pobieram członków z mojej listy i nie chcę sortować tego za każdym razem, gdy pobieram członka na wypadek nowy został dodany. Czy ktoś może wskazać mi coś takiego, co istnieje w JDK lub nawet bibliotekach innych firm?
EDYCJA : infrastruktura danych będzie musiała zachować duplikaty.
PODSUMOWANIE ODPOWIEDZI : Wszystko to wydało mi się bardzo interesujące i wiele się nauczyłem. Szczególnie Aioobe zasługuje na wyróżnienie za jego wytrwałość w próbach spełnienia moich powyższych wymagań (głównie posortowana implementacja java.util.List, która obsługuje duplikaty). Przyjąłem jego odpowiedź jako najdokładniejszą w odniesieniu do tego, o co pytałem, i najbardziej prowokowała do myślenia na temat implikacji tego, czego szukałem, nawet jeśli to, o co zapytałem, nie było dokładnie tym, czego potrzebowałem.
Problem z tym, o co prosiłem, tkwi w samym interfejsie List i koncepcji opcjonalnych metod w interfejsie. Cytując javadoc:
Użytkownik tego interfejsu ma precyzyjną kontrolę nad tym, gdzie na liście wstawiany jest każdy element.
Wstawianie do posortowanej listy nie ma precyzyjnej kontroli nad punktem wstawiania. Następnie musisz pomyśleć, jak poradzisz sobie z niektórymi metodami. Weźmy add
na przykład:
public boolean add (Object o)
Appends the specified element to the end of this list (optional operation).
Jesteś teraz w niewygodnej sytuacji: 1) Zerwanie kontraktu i zaimplementowanie posortowanej wersji add 2) Pozwolenie na add
dodanie elementu na koniec listy, zerwanie posortowanego porządku 3) Opuszczenie add
(jako opcjonalne) UnsupportedOperationException
i wdrożenie innej metody, która dodaje elementy w posortowanych.
Opcja 3 jest prawdopodobnie najlepsza, ale uważam za nieprzyjemne posiadanie metody dodawania, której nie możesz użyć, i innej metody sortowanej, której nie ma w interfejsie.
Inne powiązane rozwiązania (w dowolnej kolejności):
- java.util.PriorityQueue, która jest prawdopodobnie najbliższa temu, czego potrzebowałem, niż to, o co prosiłem. W moim przypadku kolejka nie jest najdokładniejszą definicją zbioru obiektów, ale funkcjonalnie robi wszystko, czego potrzebuję.
- net.sourceforge.nite.util.SortedList . Jednak ta implementacja przerywa kontrakt interfejsu List przez zaimplementowanie sortowania w
add(Object obj)
metodzie i, co dziwne, nie ma wpływu na metodęadd(int index, Object obj)
. Ogólny konsensus sugeruje,throw new UnsupportedOperationException()
że w tym scenariuszu może być lepszym wyborem. - TreeMultiSet Guavy Zestaw implementacji, który obsługuje duplikaty
- ca.odell.glazedlists.SortedList Ta klasa zawiera zastrzeżenie w jej javadoc:
Warning: This class breaks the contract required by List