Anda tidak bisa, karena a Settidak memiliki metode akses acak (yaitu, .get()elemen pada indeks tertentu), yang pada dasarnya diperlukan untuk algoritme sortir;)
fge
3
Anda dapat mengonversinya menjadi daftar terlebih dahulu lalu mengurutkan jika Anda perlu mengurutkan
demongolem
Anda tidak bisa karena HashSettidak memiliki urutan yang ditentukan. Pertanyaan Anda mengandung kontradiksi dalam istilah.
Menempatkan elemen saja tidak akan memberikan fleksibilitas pengurutan pada urutan apa pun dengan elemen apa pun di dalamnya. Solusi di atas bisa.
Jess
16
Cara Java 8 untuk mengurutkannya adalah:
fooHashSet.stream().sorted(Comparator.comparing(Foo::getSize))//comparator - how you want to sort it.collect(Collectors.toList());//collector - what you want to collect it to
* Foo::getSizeIni adalah contoh bagaimana mengurutkan HashSet dari YourItem secara alami berdasarkan ukuran.
* Collectors.toList()akan mengumpulkan hasil pengurutan ke dalam Daftar yang akan Anda perlukan untuk menangkapnyaList<Foo> sortedListOfFoo =
Mengapa Anda berasumsi bahwa mereka menyimpan Stringnilai?
Sotirios Delimanolis
Saya tidak berpikir, mungkin penggunaan leksografik saya tidak tepat ;-)
P45 Imminent
3
Itu sangat salah. Itu tidak menyimpan kunci dalam urutan leksografik (sp?). Ia menggunakan pengurutan alami mereka (yang bergantung pada Comparableantarmuka yang diimplementasikan oleh tombol) atau menggunakan yang disediakan Comparator.
Sotirios Delimanolis
Saya sudah mengedit. Lebih baik menurut Anda, atau haruskah saya menghapus jawabannya?
P45 Segera
1
Jika Anda memindahkan HashSetke TreeSet, kelas Anda harus mengimplementasikan Comparableantarmuka atau menyediakan kustom Comparator. Jika tidak, karena Anda tidak dapat mengurutkan HashSet, cukup ubah menjadi Listdan urutkan.
Luiggi Mendoza
5
Anda dapat menggunakan kolektor Java 8 dan TreeSet
Elemen di HashSet tidak dapat diurutkan. Setiap kali Anda memasukkan elemen ke dalam HashSet, itu dapat mengacaukan urutan keseluruhan set. Memang sengaja didesain seperti itu untuk performa. Jika Anda tidak peduli dengan pesanan, HashSet akan menjadi perangkat yang paling efisien untuk penyisipan dan pencarian cepat.
TreeSet akan mengurutkan semua elemen secara otomatis setiap kali Anda memasukkan elemen.
Mungkin, yang Anda coba lakukan adalah menyortir sekali saja. Dalam hal ini, TreeSet bukanlah pilihan terbaik karena ia perlu menentukan penempatan elemen yang baru ditambahkan setiap saat.
Solusi paling efisien adalah dengan menggunakan ArrayList. Buat daftar baru dan tambahkan semua elemen lalu urutkan sekali. Jika Anda hanya ingin mempertahankan elemen unik (hapus semua duplikat seperti yang dilakukan set, kemudian masukkan daftar ke dalam LinkedHashSet, itu akan mempertahankan urutan yang telah Anda urutkan)
List<Integer> list =newArrayList<>();
list.add(6);
list.add(4);
list.add(4);
list.add(5);Collections.sort(list);Set<Integer> unique =newLinkedHashSet<>(list);// 4 5 6// The above line is not copying the objects! It only copies references.
Sekarang, Anda telah mendapatkan kumpulan yang diurutkan jika Anda menginginkannya dalam bentuk daftar lalu mengubahnya menjadi daftar.
Menurut pendapat saya, jawaban LazerBanana haruslah jawaban teratas & diterima karena semua jawaban lain yang menunjuk ke java.util.TreeSet(atau pertama-tama konversikan ke daftar lalu panggil Collections.sort(...)di daftar yang dikonversi) tidak repot-repot bertanya OP sebagai objek apa yang Anda HashSetmiliki yaitu jika elemen-elemen tersebut memiliki tatanan alami yang telah ditentukan sebelumnya atau tidak & itu bukan pertanyaan opsional tetapi pertanyaan wajib.
Anda tidak bisa masuk & mulai memasukkan HashSetelemen Anda ke dalam TreeSettipe elemen jika belum mengimplementasikan Comparableantarmuka atau jika Anda tidak secara eksplisit meneruskan Comparatorke TreeSetkonstruktor.
Dari TreeSetJavaDoc,
Membuat kumpulan pohon baru yang kosong, diurutkan menurut urutan alami elemennya. Semua elemen yang dimasukkan ke dalam himpunan harus mengimplementasikan antarmuka Comparable. Lebih lanjut, semua elemen tersebut harus saling sebanding: e1.compareTo (e2) tidak boleh menampilkan ClassCastException untuk elemen e1 dan e2 dalam himpunan. Jika pengguna mencoba menambahkan elemen ke set yang melanggar batasan ini (misalnya, pengguna mencoba menambahkan elemen string ke set yang elemennya bilangan bulat), panggilan add akan memunculkan ClassCastException.
Itulah mengapa hanya semua jawaban berbasis aliran Java8 - di mana Anda menentukan pembanding Anda di tempat - hanya masuk akal karena menerapkan perbandingan di POJO menjadi opsional. Programmer mendefinisikan pembanding jika diperlukan. Mencoba mengumpulkan TreeSettanpa menanyakan pertanyaan mendasar ini juga salah (jawaban Ninja). Mengasumsikan tipe objek menjadi Stringatau Integerjuga salah.
Karena itu, masalah lain seperti,
Kinerja Penyortiran
Memory Foot Print (mempertahankan set asli dan membuat set baru yang disortir setiap kali penyortiran selesai atau ingin mengurutkan set di - tempat dll)
harus menjadi poin relevan lainnya juga. Hanya menunjuk ke API seharusnya bukan hanya niat.
Karena set Asli sudah berisi hanya elemen unik & batasan itu juga dipertahankan oleh set yang diurutkan sehingga set asli perlu dihapus dari memori karena data diduplikasi.
1.Add all set element in list -> al.addAll(s);2.Sort all the elements in list using ->Collections.sort(al);publicclassSortSetProblem{publicstaticvoid main(String[] args){ArrayList<String> al =newArrayList();Set<String> s =newHashSet<>();
s.add("ved");
s.add("prakash");
s.add("sharma");
s.add("apple");
s.add("ved");
s.add("banana");System.out.println("Before Sorting");for(String s1 : s){System.out.print(" "+ s1);}System.out.println("After Sorting");
al.addAll(s);Collections.sort(al);for(String set : al){System.out.print(" "+ set);}}}
Kami tidak dapat memutuskan bahwa elemen dari sebuah HashSet akan diurutkan secara otomatis. Tapi kita bisa mengurutkannya dengan mengubahnya menjadi TreeSet atau List seperti ArrayList atau LinkedList dll.
// Create a TreeSet object of class ETreeSet<E> ts =newTreeSet<E>();// Convert your HashSet into TreeSet
ts.addAll(yourHashSet);System.out.println(ts.toString()+"\t Sorted Automatically");
Saya menggunakan ini dalam pernyataan cetak, jadi jika Anda perlu benar-benar mempertahankan pemesanan, Anda mungkin perlu menggunakan TreeSets atau struktur lain yang diusulkan di utas ini.
HashSet
adalah koleksi yang tidak diurutkan.Set
tidak memiliki metode akses acak (yaitu,.get()
elemen pada indeks tertentu), yang pada dasarnya diperlukan untuk algoritme sortir;)HashSet
tidak memiliki urutan yang ditentukan. Pertanyaan Anda mengandung kontradiksi dalam istilah.Jawaban:
HashSet tidak menjamin urutan elemen apa pun. Jika Anda membutuhkan jaminan ini, pertimbangkan untuk menggunakan TreeSet untuk menampung elemen Anda.
Namun jika Anda hanya ingin elemen Anda disortir untuk kejadian yang satu ini, maka buat sementara saja Daftar dan urutkan:
sumber
List<String> sortedList = new ArrayList<String>(yourHashSet);
Tambahkan semua objek Anda ke
TreeSet
, Anda akan mendapatkan Set yang diurutkan. Di bawah ini adalah contoh mentahnya.sumber
TreeSet myTreeSet = new TreeSet(myHashSet);
Anda dapat menghindari menambahkan semua elemen ke Treeset lagi.Anda dapat menggunakan TreeSet sebagai gantinya.
sumber
Cara Java 8 untuk mengurutkannya adalah:
*
Foo::getSize
Ini adalah contoh bagaimana mengurutkan HashSet dari YourItem secara alami berdasarkan ukuran.*
Collectors.toList()
akan mengumpulkan hasil pengurutan ke dalam Daftar yang akan Anda perlukan untuk menangkapnyaList<Foo> sortedListOfFoo =
sumber
Gunakan
java.util.TreeSet
sebagai objek sebenarnya. Saat Anda mengulang koleksi ini, nilainya kembali dalam urutan yang ditentukan dengan baik.Jika Anda menggunakan
java.util.HashSet
maka urutannya tergantung pada fungsi hash internal yang hampir pasti bukan leksikografik (berdasarkan konten).sumber
String
nilai?Comparable
antarmuka yang diimplementasikan oleh tombol) atau menggunakan yang disediakanComparator
.HashSet
keTreeSet
, kelas Anda harus mengimplementasikanComparable
antarmuka atau menyediakan kustomComparator
. Jika tidak, karena Anda tidak dapat mengurutkanHashSet
, cukup ubah menjadiList
dan urutkan.Anda dapat menggunakan kolektor Java 8 dan TreeSet
list.stream().collect(Collectors.toCollection(TreeSet::new))
sumber
new TreeSet<>(hashSet)
lebih ringkas dan mungkin lebih efisien.Anda dapat menggunakan TreeSet seperti yang disebutkan dalam jawaban lain.
Berikut sedikit penjelasan tentang cara menggunakannya:
Keluaran:
sumber
Elemen di HashSet tidak dapat diurutkan. Setiap kali Anda memasukkan elemen ke dalam HashSet, itu dapat mengacaukan urutan keseluruhan set. Memang sengaja didesain seperti itu untuk performa. Jika Anda tidak peduli dengan pesanan, HashSet akan menjadi perangkat yang paling efisien untuk penyisipan dan pencarian cepat.
TreeSet akan mengurutkan semua elemen secara otomatis setiap kali Anda memasukkan elemen.
Mungkin, yang Anda coba lakukan adalah menyortir sekali saja. Dalam hal ini, TreeSet bukanlah pilihan terbaik karena ia perlu menentukan penempatan elemen yang baru ditambahkan setiap saat.
Solusi paling efisien adalah dengan menggunakan ArrayList. Buat daftar baru dan tambahkan semua elemen lalu urutkan sekali. Jika Anda hanya ingin mempertahankan elemen unik (hapus semua duplikat seperti yang dilakukan set, kemudian masukkan daftar ke dalam LinkedHashSet, itu akan mempertahankan urutan yang telah Anda urutkan)
Sekarang, Anda telah mendapatkan kumpulan yang diurutkan jika Anda menginginkannya dalam bentuk daftar lalu mengubahnya menjadi daftar.
sumber
Berdasarkan jawaban yang diberikan oleh @LazerBanana saya akan memberikan contoh Set saya sendiri yang diurutkan berdasarkan Id Objek:
sumber
Untuk berjaga-jaga jika Anda tidak ingin menggunakan,
TreeSet
Anda dapat mencoba ini.sumber
Menurut pendapat saya, jawaban LazerBanana haruslah jawaban teratas & diterima karena semua jawaban lain yang menunjuk ke
java.util.TreeSet
(atau pertama-tama konversikan ke daftar lalu panggilCollections.sort(...)
di daftar yang dikonversi) tidak repot-repot bertanya OP sebagai objek apa yang AndaHashSet
miliki yaitu jika elemen-elemen tersebut memiliki tatanan alami yang telah ditentukan sebelumnya atau tidak & itu bukan pertanyaan opsional tetapi pertanyaan wajib.Anda tidak bisa masuk & mulai memasukkan
HashSet
elemen Anda ke dalamTreeSet
tipe elemen jika belum mengimplementasikanComparable
antarmuka atau jika Anda tidak secara eksplisit meneruskanComparator
keTreeSet
konstruktor.Dari
TreeSet
JavaDoc,Itulah mengapa hanya semua jawaban berbasis aliran Java8 - di mana Anda menentukan pembanding Anda di tempat - hanya masuk akal karena menerapkan perbandingan di POJO menjadi opsional. Programmer mendefinisikan pembanding jika diperlukan. Mencoba mengumpulkan
TreeSet
tanpa menanyakan pertanyaan mendasar ini juga salah (jawaban Ninja). Mengasumsikan tipe objek menjadiString
atauInteger
juga salah.Karena itu, masalah lain seperti,
harus menjadi poin relevan lainnya juga. Hanya menunjuk ke API seharusnya bukan hanya niat.
Karena set Asli sudah berisi hanya elemen unik & batasan itu juga dipertahankan oleh set yang diurutkan sehingga set asli perlu dihapus dari memori karena data diduplikasi.
sumber
sumber
Jika Anda ingin bagian akhir
Collection
dalam bentukSet
dan jika Anda ingin menentukan sendirinatural order
daripada yangTreeSet
maka -1. Ubah
HashSet
menjadiList
2. Urutkan sesuai keinginan
List
menggunakanComparator
3. Ubah kembali
List
menjadiLinkedHashSet
untuk mempertahankan urutan4. Tampilkan
LinkedHashSet
Program sampel -
Keluaran -
Di sini koleksi telah diurutkan sebagai -
Pertama - Urutan
String
panjangmenurun Kedua - Urutan
String
hierarki abjad menurunsumber
Anda dapat melakukannya dengan cara berikut:
Metode 1:
Metode 2:
Metode 2 lebih disukai karena metode lain menghabiskan banyak waktu untuk mentransfer data bolak-balik antara hashset dan daftar.
sumber
Kami tidak dapat memutuskan bahwa elemen dari sebuah HashSet akan diurutkan secara otomatis. Tapi kita bisa mengurutkannya dengan mengubahnya menjadi TreeSet atau List seperti ArrayList atau LinkedList dll.
sumber
Anda dapat menggunakan perpustakaan jambu biji untuk hal yang sama
sumber
SortedSet telah ditambahkan Sejak java 7 https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html
sumber
Anda dapat membungkusnya dalam TreeSet seperti ini:
keluaran:
item mySet [1, 3, 4, 5]
item treeSet [1, 3, 4, 5]
keluaran:
item mySet [enam, empat, lima, dua, elf]
item treeSet [elf, lima, empat, enam, dua]
persyaratan untuk metode ini adalah bahwa objek set / list harus sebanding (mengimplementasikan antarmuka Comparable)
sumber
Perintah sederhana ini melakukan trik untuk saya:
Saya menggunakan ini dalam pernyataan cetak, jadi jika Anda perlu benar-benar mempertahankan pemesanan, Anda mungkin perlu menggunakan TreeSets atau struktur lain yang diusulkan di utas ini.
sumber
toList
.