Apakah Java Set mempertahankan pesanan? Suatu metode mengembalikan Set kepada saya dan konon datanya dipesan tetapi iterasi pada Set tersebut, datanya tidak diurutkan. Apakah ada cara yang lebih baik untuk mengelola ini? Apakah metode ini perlu diubah untuk mengembalikan sesuatu selain dari Set?
179
Jawaban:
The
Set
antarmuka tidak menyediakan jaminan pemesanan.Sub-interface-nya
SortedSet
mewakili satu set yang diurutkan berdasarkan beberapa kriteria. Di Jawa 6, ada dua kontainer standar yang diterapkanSortedSet
. MerekaTreeSet
danConcurrentSkipListSet
.Selain
SortedSet
antarmuka, ada jugaLinkedHashSet
kelasnya. Itu mengingat urutan elemen dimasukkan ke set, dan mengembalikan elemen dalam urutan itu.sumber
LinkedHashSet adalah apa yang Anda butuhkan.
sumber
List
bukan aSet
(itu tidak menjamin keunikan keanggotaan).Seperti banyak anggota menyarankan gunakan LinkedHashSet untuk mempertahankan urutan koleksi. Anda dapat membungkus set Anda menggunakan implementasi ini.
Implementasi SortedSet dapat digunakan untuk pesanan yang diurutkan tetapi untuk tujuan Anda gunakan LinkedHashSet .
Juga dari dokumen,
"Implementasi ini menyelamatkan klien-kliennya dari pemesanan yang tidak ditentukan, umumnya kacau yang disediakan oleh HashSet, tanpa menimbulkan biaya yang meningkat terkait dengan TreeSet. Hal ini dapat digunakan untuk menghasilkan salinan set yang memiliki urutan yang sama seperti aslinya, terlepas dari aslinya implementasi set: "
Sumber: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
sumber
Set hanyalah sebuah antarmuka. Untuk mempertahankan pesanan, Anda harus menggunakan implementasi spesifik antarmuka itu dan sub-antarmuka SortedSet, misalnya TreeSet atau LinkedHashSet. Anda dapat membungkus Set Anda dengan cara ini:
sumber
Berikut ini adalah ringkasan singkat dari karakteristik urutan
Set
implementasi standar yang tersedia di Jawa:Untuk kasus spesifik Anda, Anda dapat mengurutkan item terlebih dahulu dan kemudian menggunakan salah satu dari 1 atau 2 (kemungkinan besar
LinkedHashSet
atauTreeSet
). Atau sebagai alternatif dan lebih efisien , Anda bisa menambahkan data yang tidak disortir keTreeSet
yang akan mengurus penyortiran secara otomatis untuk Anda.sumber
Untuk mempertahankan pesanan, gunakan
List
atauLinkedHashSet
.sumber
LinkedHashSet
, tidak ...Map
.LinkedHashSet adalah versi HashSet yang diurutkan yang memelihara Daftar yang ditautkan ganda di semua elemen. Gunakan kelas ini alih-alih HashSet saat Anda peduli dengan urutan iterasi.
sumber
Dari javadoc untuk
Set.iterator()
:Dan, seperti yang telah dinyatakan oleh shuuchan , a
TreeSet
adalah implementasi dariSet
yang memiliki jaminan:sumber
Biasanya yang diatur tidak menjaga urutan, seperti HashSet agar dapat dengan cepat menemukan emelent, tetapi Anda dapat mencoba LinkedHashSet itu akan menjaga urutan yang Anda masukkan.
sumber
Ada 2 hal berbeda.
sumber
Set interface itu sendiri tidak menetapkan urutan tertentu. Namun, SortedSet melakukannya.
sumber
Iterator yang dikembalikan oleh Set tidak seharusnya mengembalikan data dengan cara Dipesan. Lihat Dua java.util.Iterator ini ke koleksi yang sama: apakah mereka harus mengembalikan elemen dalam urutan yang sama?
sumber
Hanya
SortedSet
dapat melakukan pemesananSet
sumber