Dlaczego nie skorzystać z tego, co najlepsze z obu światów? Jeśli nigdy więcej jej nie użyjesz, posortuj przy użyciu TreeSet i zainicjuj ArrayList z zawartością
List<ComparableObject> sortedCollection =
new ArrayList<ComparableObject>(
new TreeSet<ComparableObject>(map.values()));
EDYTOWAĆ:
Stworzyłem benchmark (możesz uzyskać do niego dostęp na pastebin.com/5pyPMJav ), aby przetestować trzy podejścia (ArrayList + Collections.sort, TreeSet i moje najlepsze podejście z obu światów), a moje zawsze wygrywa. Plik testowy tworzy mapę z 10000 elementów, których wartości mają celowo okropny komparator, a następnie każda z trzech strategii ma szansę a) posortować dane ib) powtórzyć je. Oto przykładowe dane wyjściowe (możesz je samodzielnie przetestować):
EDYCJA: Dodałem aspekt, który rejestruje wywołania do Thingy.compareTo (Thingy), a także dodałem nową strategię opartą na PriorityQueues, która jest znacznie szybsza niż którekolwiek z poprzednich rozwiązań (przynajmniej w sortowaniu).
compareTo() calls:123490
Transformer ArrayListTransformer
Creation: 255885873 ns (0.255885873 seconds)
Iteration: 2582591 ns (0.002582591 seconds)
Item count: 10000
compareTo() calls:121665
Transformer TreeSetTransformer
Creation: 199893004 ns (0.199893004 seconds)
Iteration: 4848242 ns (0.004848242 seconds)
Item count: 10000
compareTo() calls:121665
Transformer BestOfBothWorldsTransformer
Creation: 216952504 ns (0.216952504 seconds)
Iteration: 1604604 ns (0.001604604 seconds)
Item count: 10000
compareTo() calls:18819
Transformer PriorityQueueTransformer
Creation: 35119198 ns (0.035119198 seconds)
Iteration: 2803639 ns (0.002803639 seconds)
Item count: 10000
O dziwo, moje podejście działa najlepiej w iteracji (pomyślałem, że nie będzie różnic w podejściu ArrayList w iteracji, czy mam błąd w moim benchmarku?)
Zastrzeżenie: Wiem, że to prawdopodobnie okropny punkt odniesienia, ale pomaga ci to zrozumieć i na pewno nie manipulowałem nim, aby moje podejście wygrywało.
(Kod ma zależność do apache commons / lang dla konstruktorów equals / hashcode / compareTo, ale powinno być łatwe do zreformowania)