Java'da bir tane var Set
ve sıralı bir hale getirmek istiyorum List
. java.util.Collections
Pakette bunu benim için yapacak bir yöntem var mı ?
Java'da bir tane var Set
ve sıralı bir hale getirmek istiyorum List
. java.util.Collections
Pakette bunu benim için yapacak bir yöntem var mı ?
Yanıtlar:
OP tarafından verilen cevap en iyisi değildir. Yeni List
ve gereksiz yeni bir dizi oluşturduğundan verimsizdir . Ayrıca, genel dizilerle ilgili türdeki güvenlik sorunları nedeniyle "denetlenmeyen" uyarılar oluşturur.
Bunun yerine, şöyle bir şey kullanın:
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;
}
İşte bir kullanım örneği:
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
Sınıf, asSortedList()
yazdığım yöntemi içeren sınıftır . Başka bir deyişle, Util
sınıfı kendiniz yazar ve bu kodu içine koyarsınız.
Sıralama kümesi:
return new TreeSet(setIWantSorted);
veya:
return new ArrayList(new TreeSet(setIWantSorted));
Set
?
new TreeSet
, Collection
s kabul ediyor Set
. Bu sorunun cevabını okuyan herkes Set
, asıl sorunun sorduğu soru olsa da, bir
List myList = new ArrayList(collection);
Collections.sort(myList);
… Ancak hile yapmalı. Varsa, Generics ile lezzet katın.
Comparable
sıralıyorsanız, compareTo
yöntemi her zaman uygulayabilir ve geçersiz kılabilirsiniz .
Sıralama uygulaması sağlamak için Karşılaştırıcı veya Karşılaştırılabilir arabirimi kullanmak her zaman güvenlidir (nesne ilkel veri türleri için bir String veya Wrapper sınıfları değilse). Çalışanları ada göre sıralamak için bir karşılaştırıcı uygulamasına örnek olarak
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 ());
Karşılaştırıcı, aynı nesne üzerinde farklı sıralama algoritması (emp adı, emp maaşı vb.) Gerektiğinde yararlıdır. Gerekli modda Karşılaştırılabilir arabirim kullanılarak tek modlu sıralama yapılabilir.
Bunu yapmak için tek bir yöntem yok. Bunu kullan:
@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);
burada orijinal küme = sıralanmamış küme ve liste = döndürülecek liste
@Jeremy Stein Aynı kodu uygulamak istedim. Ben de kümeyi listeye sıralamak istedim, bu yüzden Set I dönüştürdüğüm set değerlerini kullanmak yerine List'e dönüştürdüm ve bu listeyi bir değişkenle sıralayın. Bu kod bana yardımcı oldu,
set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());