W Javie mam Set
i chcę przekształcić go w posortowany List
. Czy w java.util.Collections
pakiecie jest metoda , która zrobi to za mnie?
W Javie mam Set
i chcę przekształcić go w posortowany List
. Czy w java.util.Collections
pakiecie jest metoda , która zrobi to za mnie?
Odpowiedzi:
Odpowiedź udzielona przez PO nie jest najlepsza. Jest nieefektywny, ponieważ tworzy nową List
i niepotrzebną nową tablicę. Ponadto generuje „niesprawdzone” ostrzeżenia z powodu problemów z bezpieczeństwem typów związanych z tablicami generycznymi.
Zamiast tego użyj czegoś takiego:
public static
<T extends Comparable<? super T>> List<T> asSortedList(Collection<T> c) {
List<T> list = new ArrayList<T>(c);
java.util.Collections.sort(list);
return list;
}
Oto przykład użycia:
Map<Integer, String> map = new HashMap<Integer, String>();
/* Add entries to the map. */
...
/* Now get a sorted list of the *values* in the map. */
Collection<String> unsorted = map.values();
List<String> sorted = Util.asSortedList(unsorted);
Util
Klasa to ta, która zawiera asSortedList()
metodę, którą napisałem. Innymi słowy, sam piszesz Util
klasę i umieszczasz w niej kod.
Posortowany zestaw:
return new TreeSet(setIWantSorted);
lub:
return new ArrayList(new TreeSet(setIWantSorted));
Set
?
new TreeSet
akceptuje Collection
s, a nie tylko Set
s. Nie każdy, kto czyta tę odpowiedź, będzie używał znaku Set
, mimo że to właśnie dotyczy pierwotnego pytania.
List myList = new ArrayList(collection);
Collections.sort(myList);
… Powinien jednak załatwić sprawę. W razie potrzeby dodaj do smaku leki generyczne.
Comparable
i przesłonić compareTo
metodę.
Zawsze można bezpiecznie używać interfejsu Comparator lub Comparable do zapewnienia implementacji sortowania (jeśli obiekt nie jest klasą String lub Wrapper dla pierwotnych typów danych). Jako przykład implementacji komparatora do sortowania pracowników na podstawie nazwiska
List<Employees> empList = new LinkedList<Employees>(EmpSet);
class EmployeeComparator implements Comparator<Employee> {
public int compare(Employee e1, Employee e2) {
return e1.getName().compareTo(e2.getName());
}
}
Collections.sort(empList , new EmployeeComparator ());
Komparator jest przydatny, gdy musisz mieć inny algorytm sortowania dla tego samego obiektu (powiedz nazwę emp., Wynagrodzenie emp. Itp.). Sortowanie w trybie pojedynczym można zaimplementować za pomocą interfejsu Comparable w wymaganym obiekcie.
Nie ma jednej metody, aby to zrobić. Użyj tego:
@SuppressWarnings("unchecked")
public static <T extends Comparable> List<T> asSortedList(Collection<T> collection) {
T[] array = collection.toArray(
(T[])new Comparable[collection.size()]);
Arrays.sort(array);
return Arrays.asList(array);
}
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);
list.addAll(sortedset);
gdzie zestaw oryginałów = zestaw nieposortowany i lista = lista do zwrócenia
@Jeremy Stein Chciałem zaimplementować ten sam kod. Chciałem również posortować zestaw do listy, więc zamiast używać Set, przekonwertowałem ustawione wartości na List i posortowałem tę listę według jednej ze zmiennych. Ten kod mi pomógł,
set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());