Saya seorang pemula di Jawa. Harap sarankan koleksi mana yang dapat / harus digunakan untuk memelihara daftar yang disortir di Jawa. Saya sudah mencoba Map
dan Set
, tetapi bukan itu yang saya cari.
sumber
Saya seorang pemula di Jawa. Harap sarankan koleksi mana yang dapat / harus digunakan untuk memelihara daftar yang disortir di Jawa. Saya sudah mencoba Map
dan Set
, tetapi bukan itu yang saya cari.
Ini datang sangat terlambat, tetapi ada kelas di JDK hanya untuk tujuan memiliki daftar yang diurutkan. Namanya (agak tidak sesuai dengan Sorted*
antarmuka lainnya ) " java.util.PriorityQueue
". Itu dapat mengurutkan Comparable<?>
atau menggunakan Comparator
.
Perbedaannya dengan List
penggunaan yang diurutkan Collections.sort(...)
adalah bahwa ini akan mempertahankan urutan parsial setiap saat, dengan kinerja penyisipan O (log (n)), dengan menggunakan struktur data tumpukan, sedangkan memasukkan dalam urutan ArrayList
akan menjadi O (n) (yaitu, menggunakan pencarian biner dan pindah).
Namun, tidak seperti a List
, PriorityQueue
tidak mendukung akses yang diindeks ( get(5)
), satu-satunya cara untuk mengakses item di heap adalah dengan mengeluarkannya, satu per satu (dengan demikian namanya PriorityQueue
).
TreeMap dan TreeSet akan memberi Anda iterasi atas konten dalam urutan diurutkan. Atau Anda bisa menggunakan ArrayList dan menggunakan Collections.sort () untuk mengurutkannya. Semua kelas itu ada di java.util
sumber
Jika Anda ingin mempertahankan daftar yang disortir yang akan sering Anda ubah (yaitu struktur yang, selain disortir, memungkinkan duplikat dan yang unsur-unsurnya dapat direferensikan secara efisien berdasarkan indeks), kemudian gunakan ArrayList tetapi ketika Anda perlu memasukkan elemen. , selalu gunakan Collections.binarySearch () untuk menentukan indeks tempat Anda menambahkan elemen yang diberikan. Metode yang terakhir memberi tahu Anda indeks yang harus Anda sisipkan agar daftar Anda tetap terurut.
sumber
Gunakan kelas TreeMultiset Google Guava . Jambu memiliki API koleksi spektakuler.
Salah satu masalah dengan menyediakan implementasi Daftar yang mempertahankan urutan diurutkan adalah janji yang dibuat dalam JavaDocs dari
add()
metode ini.sumber
List
selalu ditambahkan di akhir.Anda menginginkan implementasi SortedSet , yaitu TreeSet .
sumber
Ada beberapa opsi. Saya menyarankan TreeSet jika Anda tidak ingin duplikat dan objek yang Anda sisipkan sebanding.
Anda juga dapat menggunakan metode statis dari kelas Koleksi untuk melakukan ini.
Lihat Urut Koleksi # (java.util.List) dan TreeSet untuk info lebih lanjut.
sumber
Jika Anda hanya ingin mengurutkan daftar, gunakan segala jenis Daftar dan gunakan Collections.sort () . Jika Anda ingin memastikan elemen dalam daftar itu unik dan selalu diurutkan, gunakan SortedSet .
sumber
Apa yang saya lakukan adalah mengimplementasikan Daftar yang memiliki instance internal dengan semua metode yang didelegasikan.
Setelah itu, saya telah menerapkan metode baru "putOrdered" yang menyisipkan di posisi yang tepat jika elemen tidak ada atau ganti kalau-kalau ada.
Jika Anda ingin mengizinkan elemen yang berulang ulang, implementasikan saja addOrdered saja (atau keduanya).
Jika Anda ingin menghindari penyisipan, Anda juga dapat membuang dan tidak mendukung operasi pada metode "tambah" dan "set".
... dan juga Anda harus berhati-hati dengan metode ListIterator karena mereka dapat mengubah daftar internal Anda. Dalam hal ini Anda dapat mengembalikan salinan daftar internal atau kembali melemparkan pengecualian.
sumber
List
kontrak. Mungkin akan lebih baik hanya menerapkanCollection
. Dan jikaContactList
diurutkan, makacontains()
dapat diimplementasikan menggunakanbinarySearch
juga agar lebih efisien.Cara paling efisien untuk mengimplementasikan daftar yang disortir seperti yang Anda inginkan adalah dengan mengimplementasikan skiplist yang dapat diindeks seperti di sini: Wikipedia: Daftar yang dapat diindeks . Itu akan memungkinkan untuk memasukkan / menghapus dalam O (log (n)) dan akan memungkinkan untuk memiliki akses yang diindeks pada saat yang sama. Dan itu juga akan memungkinkan duplikat.
Skiplist sangat menarik dan, bisa saya katakan, struktur data yang diremehkan. Sayangnya tidak ada implementasi skiplist yang diindeks di perpustakaan berbasis Java, tetapi Anda dapat menggunakan salah satu dari implementasi open source atau mengimplementasikannya sendiri. Ada implementasi Skiplist reguler seperti ConcurrentSkipListSet dan ConcurrentSkipListMap
sumber
TreeSet tidak akan berfungsi karena mereka tidak memperbolehkan duplikat plus mereka tidak menyediakan metode untuk mengambil elemen pada posisi tertentu. PriorityQueue tidak akan berfungsi karena tidak memungkinkan mengambil elemen pada posisi tertentu yang merupakan persyaratan dasar untuk daftar. Saya pikir Anda perlu menerapkan algoritma Anda sendiri untuk mempertahankan daftar yang diurutkan di Jawa dengan waktu penyisipan O (logn), kecuali jika Anda tidak memerlukan duplikat. Mungkin solusi bisa menggunakan TreeMap di mana kuncinya adalah subclass dari item yang menimpa metode equals sehingga duplikat diperbolehkan.
sumber
Menggunakan LambdaJ
Anda dapat mencoba menyelesaikan tugas-tugas ini dengan LambdaJ jika Anda menggunakan versi sebelumnya ke java 8. Anda dapat menemukannya di sini: http://code.google.com/p/lambdaj/
Di sini Anda memiliki contoh:
Urutkan berulang
Sortir dengan LambdaJ
Tentu saja, memiliki keindahan semacam ini berdampak pada kinerja (rata-rata 2 kali), tetapi dapatkah Anda menemukan kode yang lebih mudah dibaca?
Sortir dengan java 8 menggunakan ekspresi lambda
sumber
-(p1.getAge().compareTo(p2.getAge()))
Masalah dengan PriorityQueue adalah didukung oleh array sederhana, dan logika yang mengatur elemen dilakukan oleh "antrian [2 * n +1]] dan antrian [2 * (n +1)]" thingie. Ini berfungsi dengan baik jika Anda hanya menarik dari kepala, tetapi membuatnya tidak berguna jika Anda mencoba memanggil.
Saya mengatasi masalah ini dengan menggunakan com.google.common.collect.TreeMultimap, tapi saya menyediakan pembanding khusus untuk nilai-nilai, yang dibungkus dengan Pemesanan, yang tidak pernah mengembalikan 0.
ex. untuk Double:
Dengan cara ini saya mendapatkan nilai-nilai secara berurutan ketika saya memanggil .toArray (), dan juga memiliki duplikat.
sumber
Yang Anda inginkan adalah pohon pencarian biner. Ia memelihara urutan yang diurutkan sambil menawarkan akses logaritmik untuk pencarian, pemindahan dan penyisipan (kecuali jika Anda memiliki pohon yang mengalami kemunduran - maka itu linear). Ini cukup mudah diimplementasikan dan Anda bahkan dapat membuatnya mengimplementasikan antarmuka Daftar, tetapi kemudian akses indeks menjadi rumit.
Pendekatan kedua adalah memiliki ArrayList dan kemudian implementasi semacam gelembung. Karena Anda memasukkan atau menghapus satu elemen pada suatu waktu, waktu akses untuk penyisipan dan pemindahan adalah linear. Pencarian bersifat logaritmik dan akses indeks konstan (waktu dapat berbeda untuk LinkedList). Satu-satunya kode yang Anda butuhkan adalah 5, mungkin 6 baris semacam gelembung.
sumber
Anda dapat menggunakan Arraylist dan Treemap, seperti yang Anda katakan Anda ingin nilai berulang juga maka Anda tidak dapat menggunakan TreeSet, meskipun itu diurutkan juga, tetapi Anda harus mendefinisikan komparator.
sumber
Untuk Set Anda dapat menggunakan TreeSet. TreeSet memesan elemen-elemennya berdasarkan pemesanan alami atau urutan penyortiran apa pun yang diteruskan ke Comparable untuk objek tertentu itu. Untuk peta gunakan TreeMap. TreeMap menyediakan kunci penyortiran. Untuk menambahkan objek sebagai kunci ke TreeMap bahwa kelas harus mengimplementasikan antarmuka yang sebanding yang pada gilirannya memaksa untuk menerapkan membandingkan ke () metode yang berisi definisi urutan penyortiran. http://techmastertutorial.in/java-collection-impl.html
sumber
Gunakan metode sort () untuk mengurutkan daftar seperti di bawah ini:
Untuk referensi, lihat tautan: http://tutorials.jenkov.com/java-collections/sorting.html
sumber
Gunakan
TreeSet
yang memberi elemen dalam urutan diurutkan. ATAU gunakanCollection.sort()
untuk penyortiran eksternalComparator()
.sumber
sumber
dengan Java 8 Comparator, jika kita ingin mengurutkan daftar maka Berikut adalah 10 kota terpadat di dunia dan kami ingin mengurutkannya berdasarkan nama, seperti dilansir oleh Time. Osaka, Jepang. ... Kota Meksiko, Meksiko. ... Beijing, Cina. ... São Paulo, Brasil. ... Mumbai, India. ... Shanghai, Cina. ... Delhi, India. ... Tokyo, Jepang.
sumber
Mengurutkan ArrayList sesuai dengan kriteria yang ditentukan pengguna.
Kelas Model
Kelas Penyortiran
Kelas Utama
Keluaran
sumber