2017-02-08 10 views
0

Я пытался использовать TreeSet:Java отсортирован Collection осущ, что позволяет многим равные значения

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)); 

, но проблема в том, что он не может содержать более одного одинаковые значения в терминах компаратор, и это только один из продукта будет в комплекте products.

мне нужна реализация Collection, которая будет заказывать вновь вставленный значение, позволит многим равны (в терминах компараторов) значений, и имеют вставки сложности журнала (п) (возможно дерево на основе осущ)

+1

ли ваши продукты имеют что-то уникальное, как в PRODUCTID? – assylias

+0

Возможный дубликат [Реализация списка, поддерживающая заказ] (http://stackoverflow.com/questions/10675446/list-implementation-that-maintains-ordering) – shmosel

+1

assyliad: no Мне не нужен ID Кажется, что Guava TreeMultiset в порядке для меня, но мне интересно, могу ли я это сделать, просто используя API Java Collection. –

ответ

4

class в JDK, который соответствует вашим точным требованиям, - PriorityQueue. Из документации:

Неограниченная очередь приоритетов на основе кучи приоритета. Элементы очереди приоритетов упорядочиваются в соответствии с их естественным порядком или Comparator, предусмотренными во время построения очереди, в зависимости от того, какой конструктор используется.

И

Реализация Примечание: эта реализация обеспечивает O(log(n)) время для enqueuing и методов (извлечение из offer, poll, remove() и add); линейное время для методов remove(Object) и contains(Object); и постоянное время для методов извлечения (peek, element и size).


Вы также можете продолжить использовать TreeSet но обеспечивают Comparator, что дает однозначного ответа. Например, если ваш Product имеет уникальный name:

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

Обратите внимание на использование Comparator.comparing, а не ваш лямбда - это аккуратнее и надежнее.

+0

Спасибо, Я только что попробовал JDK PriorityOueue, и это нормально для меня. –

2

Если вам действительно нужно заказать элементы во время вставки, вы можете использовать Guava's TreeMultiset.

0

Итак,
PriorityQueue работал для меня.

TreeMultiset не было. Когда я добавляю два разных объекта:
products.add(new Product(10)); products.add(new Product(10));
содержит две ссылки для первой инстанции, и ни для второго()