Impl Koleksi yang diurutkan Java yang memungkinkan banyak nilai yang sama

Saya mencoba menggunakan TreeSet:

Comparator<Product> pc = (p1, p2) -> ((Double) p1.getPrice()).compareTo(p2.getPrice());
Set<Product> products = new TreeSet<>(pc);
products.add(new Product(10));
products.add(new Product(10));

tetapi masalahnya adalah ia tidak boleh berisi lebih dari satu nilai yang sama dalam hal Pembanding, sehingga hanya satu produk yang akan berada di products set.

Saya memerlukan beberapa implementasi Koleksi, yang akan mengurutkan nilai yang baru dimasukkan, mengizinkan banyak nilai yang sama (dalam hal Pembanding), dan memasukkan kompleksitas log(n) (mungkin impl berbasis pohon)


person Kysil Ivan    schedule 08.02.2017    source sumber
comment
Apakah produk Anda memiliki sesuatu yang unik, seperti productId?   -  person assylias    schedule 08.02.2017
comment
Kemungkinan duplikat dari Implementasi daftar yang mempertahankan pengurutan   -  person shmosel    schedule 08.02.2017
comment
assyliad: tidak, saya tidak memerlukan ID Tampaknya Guava TreeMultiset baik-baik saja bagi saya, tetapi saya ingin tahu apakah saya dapat melakukannya hanya dengan menggunakan Java Collection API.   -  person Kysil Ivan    schedule 08.02.2017
comment
Saat Anda mengatakan berbasis pohon, apakah yang Anda maksud adalah diurutkan? Penerapan koleksi secara internal seharusnya tidak menjadi masalah bagi Anda.   -  person Andy Turner    schedule 08.02.2017
comment
Anda mungkin menemukan sesuatu yang menarik di Mengapa tidak ada SortedList di Java?.   -  person Andy Turner    schedule 08.02.2017
comment
Untuk perbandingan kompleksitas waktu misalnya lihat infotechgems.blogspot.de/ 2011/11/.   -  person René Scheibe    schedule 08.02.2017


Jawaban (3)


class di JDK yang sesuai dengan kebutuhan Anda adalah PriorityQueue . Dari dokumentasi:

Antrean prioritas tak terbatas berdasarkan tumpukan prioritas. Elemen antrian prioritas diurutkan berdasarkan urutan alaminya, atau dengan Comparator yang disediakan pada waktu konstruksi antrian, bergantung pada konstruktor mana yang digunakan.

Dan

Catatan implementasi: implementasi ini menyediakan O(log(n)) waktu untuk metode enqueuing dan dequeuing (offer, poll, remove() dan add); waktu linier untuk metode remove(Object) dan contains(Object); dan waktu konstan untuk metode pengambilan (peek, element, dan size).


Anda juga dapat terus menggunakan TreeSet tetapi berikan Comparator yang memberikan jawaban unik. Misalnya, jika Product Anda memiliki name unik:

Comparator<Product> pc = Comparator.comparing(Product::getPrice)
                         .thenComparing(Comparator.comparing(Product::getName));

Perhatikan penggunaan Comparator.comparing daripada lambda Anda - ini lebih rapi dan kuat.

person Boris the Spider    schedule 08.02.2017
comment
Terima kasih, saya baru saja mencoba JDK PriorityOueue dan tidak masalah bagi saya. - person Kysil Ivan; 08.02.2017

Jika Anda benar-benar perlu memesan elemen pada waktu penyisipan, Anda dapat menggunakan TreeMultiset.

person René Scheibe    schedule 08.02.2017

Jadi,
PriorityQueue berfungsi untuk Saya.

TreeMultiset berhasil bukan. Saat saya menambahkan dua objek berbeda:
products.add(new Product(10)); products.add(new Product(10));
objek tersebut berisi dua tautan untuk contoh pertama, dan tidak ada untuk yang kedua()

person Kysil Ivan    schedule 08.02.2017