Bagaimana cara saya mengurutkan Set ke Daftar di Jawa?

169

Di Jawa, saya punya Set, dan saya ingin mengubahnya menjadi diurutkan List. Apakah ada metode dalam java.util.Collectionspaket yang akan melakukan ini untuk saya?

Jeremy Stein
sumber

Jawaban:

214

Jawaban yang diberikan oleh OP bukanlah yang terbaik. Itu tidak efisien, karena menciptakan array baru yang baru List dan tidak perlu. Selain itu, ia memunculkan peringatan "tidak dicentang" karena masalah keamanan jenis di sekitar larik generik.

Sebagai gantinya, gunakan sesuatu seperti ini:

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;
}

Berikut ini contoh penggunaan:

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);
erickson
sumber
3
Terima kasih! SuppressWarnings itu selalu mengganggu saya.
Jeremy Stein
4
@sunleo UtilKelasnya adalah yang berisi asSortedList()metode yang saya tulis. Dengan kata lain, Anda menulis Utilsendiri kelasnya, dan memasukkan kode itu ke dalamnya.
erickson
1
ha ha saya pikir itu dari paket default seperti java.util ok terima kasih.
sunleo
3
Ini mungkin fungsi Utilitas generik yang bagus, tetapi kenyataannya masih belum efisien. Pertimbangkan penyortiran di tempat dengan memastikan Anda memiliki set di wadah yang tepat untuk memulai. Juga pertimbangkan penggunaan TreeSet sebagai wadah langsung data Anda. Jika data Anda harus unik, dan Anda membutuhkan Set, kemudian gunakan TreeSet, menangkap dua lalat dalam satu swat.
YoYo
1
Sebagai catatan bagi orang-orang yang hanya membaca jawaban teratas: Lihatlah jawaban nschum di bawah ini, yang menggunakan aliran Java 8. Jika Anda dapat menggunakan Java 8, lakukan. mereka lebih fleksibel dan efisien.
Felk
74

Kumpulan yang diurutkan:

return new TreeSet(setIWantSorted);

atau:

return new ArrayList(new TreeSet(setIWantSorted));
Steve B.
sumber
Ini adalah pikiran pertama saya, tetapi penanya menginginkan Daftar
Alex B
@Alex: Pendekatan ini masih bisa digunakan; mengembalikan ArrayList baru (TreeSet baru (setIWantSorted))
Jonik
1
Saya sebenarnya menggunakan solusi ini, tetapi saya tidak akan menyarankan ini. Sebagai dokumentasi di TreeSet menyatakan (lihat download.oracle.com/javase/1.4.2/docs/api/java/util/... ), secara efektif menggunakan metode compareTo () bukan equals () metode - jadi jika Anda memiliki dua objek di set yang memiliki hasil equals () yang sama, mereka akan dilihat sebagai duplikat dan, dengan demikian, tidak akan ditambahkan ke TreeSet. Awas.
fwielstra
24
@ fwielstra: Bagaimana Anda bisa memiliki objek yang sama dalam input karena inputnya juga a Set?
ryanprayogo
2
@ryanprayogo Perlu disebutkan, karena new TreeSetmenerima Collections, bukan hanya Sets. Tidak semua orang yang membaca jawaban ini akan menggunakan Set, meskipun itulah pertanyaan awal yang diajukan.
Chris
44
List myList = new ArrayList(collection);
Collections.sort(myList);

... harus melakukan triknya. Tambahkan rasa dengan Generics jika berlaku.

Esko
sumber
Saya memiliki potongan bermanfaat yang ingin saya sumbangkan ke komunitas. Ketika saya mencari informasi itu, saya tidak dapat menemukannya. Saya berusaha membuat pekerjaan orang berikutnya lebih mudah. stackoverflow.com/questions/18557/…
Jeremy Stein
1
Ya, tentu saja, tetapi tautan yang Anda berikan itu sebenarnya berbicara tentang pertanyaan nyata (yaitu pertanyaan yang tidak memiliki jawabannya, lalu menemukannya). Pertanyaan Anda di sini hanya untuk memberikan jawaban ... Saya sebenarnya bisa memasukkan ratusan pertanyaan dan menjawab sendiri; itu bukan intinya!
Seb
5
@Seb: Saya tidak setuju. Saya tidak melihat ada yang salah dengan pertanyaan ini. Jelas itu bukan pertanyaan yang sangat sederhana, dan sekarang dia tahu cara yang lebih baik daripada yang dia lakukan sebelumnya!
Michael Myers
3
Itu tadi pertanyaan nyata, tetapi saya menemukan jawabannya sendiri setelah Google menemukan kekurangan. Stackoverflow tidak ada pada saat itu. Saya mempostingnya di situs web saya dan itu membantu orang lain, jadi saya pikir ini mungkin berguna di sini.
Jeremy Stein
Bonus: Dan jika Anda menyortir jenis objek Anda sendiri maka Anda selalu dapat menerapkan Comparabledan menimpanyacompareTo metode.
nabster
42

Berikut ini cara melakukannya dengan Streaming Java 8:

mySet.stream().sorted().collect(Collectors.toList());

atau dengan pembanding khusus:

mySet.stream().sorted(myComparator).collect(Collectors.toList());
nschum
sumber
9

Selalu aman untuk menggunakan Comparator atau Comparable interface untuk menyediakan implementasi penyortiran (jika objek bukan kelas String atau Wrapper untuk tipe data primitif). Sebagai contoh untuk implementasi komparator untuk mengurutkan karyawan berdasarkan nama

    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 ());

Pembanding berguna ketika Anda perlu memiliki algoritma pengurutan yang berbeda pada objek yang sama (Katakanlah nama emp, gaji emp, dll). Penyortiran mode tunggal dapat diimplementasikan dengan menggunakan antarmuka Sebanding dalam ke objek yang diperlukan.

Satheesh Cheveri
sumber
5

Tidak ada metode tunggal untuk melakukan itu. Gunakan ini:

@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);
}
Jeremy Stein
sumber
Ada juga fungsi Collections.sort, tapi saya pikir itu melakukan hal yang sama. +1 lagian.
CookieOfFortune
1
Collections.sort mengambil daftar sebagai parameter.
Jeremy Stein
3

Anda bisa mengonversi set menjadi ArrayList, tempat Anda bisa mengurutkan ArrayListpenggunaanCollections.sort(List) .

Ini kodenya:

keySet = (Set) map.keySet();
ArrayList list = new ArrayList(keySet);     
Collections.sort(list);
Amit
sumber
3
TreeSet sortedset = new TreeSet();
sortedset.addAll(originalset);

list.addAll(sortedset);

di mana originalset = set tidak disortir dan daftar = daftar untuk dikembalikan

Sujith Mohan
sumber
TreeSet juga menghapus duplikat daftar yang dapat menghasilkan hasil yang salah jika Anda tidak menganggapnya.
anthonymonori
2

@ Jeremy Stein Saya ingin menerapkan kode yang sama. Saya juga ingin menyortir set ke daftar, Jadi alih-alih menggunakan Set, saya mengonversi nilai set ke dalam Daftar dan mengurutkan daftar itu dengan salah satu variabelnya. Kode ini membantu saya,

set.stream().sorted(Comparator.comparing(ModelClassName::sortingVariableName)).collect(Collectors.toList());
Deepak Kumbhar
sumber
0

Saya menggunakan kode ini, yang menurut saya lebih praktis daripada jawaban yang diterima di atas:

List<Thing> thingList = new ArrayList<>(thingSet);
thingList.sort((thing1, thing2) -> thing1.getName().compareToIgnoreCase(thing2.getName()));
nn4l
sumber