Jika ada yang familiar dengan Objective-C, ada koleksi yang disebut NSOrderedSet
sebagai Set dan itemnya bisa diakses sebagai Array .
Apakah ada yang seperti ini di Jawa?
Saya pernah mendengar ada koleksi yang disebut LinkedHashMap
, tetapi saya belum menemukan yang seperti itu untuk satu set.
java
collections
set
Uko
sumber
sumber
Jawaban:
Lihatlah kelas LinkedHashSet
Dari dokumen Java :
Tabel hash dan implementasi daftar tertaut dari antarmuka Set, dengan urutan iterasi yang dapat diprediksi . Implementasi ini berbeda dari HashSet karena ia mempertahankan daftar tertaut ganda yang berjalan melalui semua entri. Daftar tertaut ini mendefinisikan pengurutan iterasi, yaitu urutan elemen yang dimasukkan ke dalam set (urutan-penyisipan) . Perhatikan bahwa urutan penyisipan tidak terpengaruh jika sebuah elemen dimasukkan kembali ke dalam set . (Sebuah elemen e dimasukkan kembali ke dalam himpunan s jika s.add (e) dipanggil ketika s.contains (e) akan mengembalikan true segera sebelum pemanggilan.).
sumber
LinkedHashMap
tetapi saya belum menemukannya entah bagaimana.LinkedHashSet
dalamnya yang memungkinkan Anda untuk mengetahui indeks elemen mana juga.Setiap Set memiliki iterator (). Iterator HashSet normal cukup acak, TreeSet melakukannya dengan urutan, iterator LinkedHashSet melakukan iterasi dengan urutan sisipan.
Namun, Anda tidak dapat mengganti elemen di LinkedHashSet. Anda dapat menghapus satu dan menambahkan yang lain, tetapi elemen baru tidak akan menggantikan aslinya. Di LinkedHashMap, Anda dapat mengganti nilai untuk kunci yang sudah ada, lalu nilainya akan tetap berada dalam urutan aslinya.
Selain itu, Anda tidak dapat memasukkan pada posisi tertentu.
Mungkin sebaiknya Anda menggunakan ArrayList dengan pemeriksaan eksplisit untuk menghindari penyisipan duplikat.
sumber
LinkedHashSet
harus melakukan itu. Terima kasih atas balasannyaLihat dokumen API standar Java . Tepat di sebelah
LinkedHashMap
, ada fileLinkedHashSet
. Tapi perhatikan bahwa urutannya adalah urutan penyisipan, bukan urutan alami elemen. Dan Anda hanya dapat melakukan iterasi dalam urutan itu, tidak melakukan akses acak (kecuali dengan menghitung langkah iterasi).Ada juga antarmuka yang
SortedSet
diimplementasikan olehTreeSet
danConcurrentSkipListSet
. Keduanya memungkinkan iterasi dalam urutan alami elemennya atau aComparator
, tetapi bukan akses acak atau urutan penyisipan.Untuk struktur data yang memiliki akses efisien menurut indeks dan dapat mengimplementasikan kriteria yang ditetapkan secara efisien, Anda memerlukan daftar lewati , tetapi tidak ada implementasi dengan fungsionalitas itu di Java Standard API, meskipun saya yakin mudah untuk menemukannya di internet.sumber
ConcurrentSkipListMap
danConcurrentSkipListSet
. Keduanya mempertahankan urutan berdasarkan tatanan alam atau Pembanding. Saya tidak mengerti jika mereka memberikan akses acak atau urutan masuk yang Anda diskusikan.TreeSet
sudah dipesan.http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html
sumber
Coba gunakan
java.util.TreeSet
alat ituSortedSet
.Mengutip dok:
Perhatikan bahwa tambah, hapus, dan isi memiliki log biaya waktu (n).
Jika Anda ingin mengakses konten kumpulan sebagai Array, Anda dapat mengonversinya dengan melakukan:
Array ini akan diurutkan dengan kriteria yang sama dengan TreeSet (natural atau dengan pembanding), dan dalam banyak kasus ini akan memiliki keuntungan daripada melakukan Arrays.sort ()
sumber
c
dan kemudian elemena
, seperti yang saya iterate atas koleksi saya ingin mendapatkan mereka dalam urutan yang sama:c
,a
dlltreeet adalah himpunan terurut, tetapi Anda tidak dapat mengakses melalui indeks item, cukup lakukan iterasi atau lanjutkan ke awal / akhir.
sumber
Jika kita berbicara tentang implementasi daftar lewati yang murah, saya bertanya-tanya dalam istilah O besar, berapa biaya operasi ini:
Maksud saya itu selalu macet ke dalam seluruh pembuatan array, jadi itu adalah O (n):
sumber
size()
metode set yang mendasarinya. Iterasi biasanyaO(n)
, ukuran biasanyaO(1)
kecualiConcurrentSkipListSet
di tempatnyaO(n)
.IndexedTreeSet dari project indexed-tree-map menyediakan fungsionalitas ini (set yang dipesan / diurutkan dengan akses seperti daftar berdasarkan indeks).
sumber
Anda mungkin juga mendapatkan beberapa utilitas dari Peta Dua Arah seperti
BiMap
dari Google GuavaDengan a
BiMap
, Anda dapat memetakan Integer secara efisien (untuk akses indeks acak) ke tipe objek lainnya.BiMap
s adalah satu-ke-satu, jadi setiap bilangan bulat yang diberikan memiliki, paling banyak, satu elemen yang terkait dengannya, dan setiap elemen memiliki satu bilangan bulat terkait. Ini dengan cerdik didukung oleh duaHashTable
contoh, sehingga menggunakan hampir dua kali lipat memori, tetapi jauh lebih efisien daripada kebiasaanList
sejauh pemrosesan karenacontains()
(yang dipanggil saat item ditambahkan untuk memeriksa apakah sudah ada) adalah waktu konstan dan operasi paralel-friendly sepertiHashSet
's, sedangkanList
implementasinya jauh lebih lambat.sumber
Saya punya masalah serupa. Saya tidak terlalu membutuhkan set yang dipesan tetapi lebih banyak daftar dengan cepat
indexOf
/contains
. Karena saya tidak menemukan apa pun di luar sana, saya menerapkannya sendiri. Inilah kodenya, ini mengimplementasikan keduanyaSet
danList
, meskipun tidak semua operasi daftar massal secepatArrayList
versinya.disclaimer: tidak diuji
sumber