Korzystam TreeBidiMap
z biblioteki kolekcji Apache . Chcę posortować to według wartości, które są doubles
.
Moja metoda polega na pobraniu jednej Collection
z wartości za pomocą:
Collection coll = themap.values();
Co oczywiście działa dobrze.
Główne pytanie: Chcę teraz wiedzieć, jak mogę przekonwertować / rzutować (nie jestem pewien, co jest poprawne) coll
na plik, List
aby można go było posortować?
Zamierzam następnie iterować posortowany List
obiekt, który powinien być w porządku, i uzyskać odpowiednie klucze z TreeBidiMap
( themap
), używając themap.getKey(iterator.next())
miejsca, w którym iterator będzie nad listą doubles
.
TreeBidiMap
jestOrderedMap
, zamówienie powinno być w porządku. Sortowanie wymagane w pytaniu dotyczy wartości, a nie kluczy.Odpowiedzi:
Jak mówi poniżej Erel Segal Halevi, jeśli coll jest już listą, możesz pominąć krok pierwszy. Ale to zależy od wewnętrznych elementów TreeBidiMap.
źródło
Coś takiego powinno działać, wywołując konstruktor ArrayList, który pobiera kolekcję:
źródło
Myślę, że odpowiedź Paula Tomblina może być marnotrawstwem, jeśli coll jest już listą, ponieważ utworzy nową listę i skopiuje wszystkie elementy. Jeśli coll zawiera wiele elementów, może to zająć dużo czasu.
Moja sugestia to:
źródło
Wierzę, że możesz to tak napisać:
źródło
źródło
@Kunigami: Myślę, że możesz się mylić co do
newArrayList
metody Guavy . Nie sprawdza, czy Iterable jest typem List, i po prostu zwraca daną Listę taką, jaka jest. To zawsze tworzy nową listę:źródło
To, czego żądasz, jest dość kosztowną operacją, upewnij się, że nie musisz tego robić często (np. W cyklu).
W przeciwnym razie możesz utworzyć własną kolekcję. Wymyśliłem taki, który ma twoje
TreeBidiMap
iTreeMultiset
pod maską. Wdrażaj tylko to, czego potrzebujesz i dbaj o integralność danych.W ten sposób masz posortowane
Multiset
wrócił zvalues()
. Jednak jeśli potrzebujesz, aby była to lista (np. Potrzebujesz tablicy podobnej do tablicyget(index)
), musisz wymyślić coś bardziej złożonego.źródło
keySet()
ivalues()
są widokami oryginałuMap
, więc kiedy zostaną zmodyfikowane, należy również zmodyfikować podkładMap
, twoje rozwiązanie tego nie obsługujeOto nieoptymalne rozwiązanie jako jedna linijka:
źródło