Как настроить приоритет очереди Java, чтобы игнорировать дубликаты?

Я думал, что add() должен игнорировать дубликаты, но мой вывод имеет дубликаты. Как не хранить дубликаты?

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

Спасибо

Ответ 1

Вот часть PriorityQueue Javadoc:

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

Итак, PriorityQueue использует Comparator (если вы указали его как аргумент конструктора) или использует метод compareTo (...) (элементы должны реализовывать интерфейс Comparable).

PriorityQueue позволяет дублировать. Поэтому, если вы хотите этого избежать, вам нужно реализовать собственную версию Queue. Вы можете найти очень элегантный способ, как это сделать в "Эффективная Java" , страница 85. В качестве альтернативы вы можете расширить класс PriorityQueue и переопределить метод добавления (это идеальное место для проверки наличия (...)).

Ответ 2

import java.util.PriorityQueue;

public class NoDuplicates<E> extends PriorityQueue<E> 
{
    @Override
    public boolean offer(E e) 
    {
        boolean isAdded = false;
        if(!super.contains(e))
        {
            isAdded = super.offer(e);
        }
        return isAdded;
    }
    public static void main(String args[])
    {
        PriorityQueue<Integer> p = new NoDuplicates<Integer>();
        p.add(10);
        p.add(20);
        p.add(10);
        for(int i =0;i<=2;i++)
        {
            System.out.println(p.poll());
        }

    }
}

Ответ 3

A PriorityQueue в Java не имеет каких-либо ограничений в отношении повторяющихся элементов. Если вы хотите, чтобы два одинаковых элемента никогда не присутствовали в очереди приоритетов, самым простым способом было бы поддерживать отдельный Set параллельно с очередью приоритетов. Каждый раз, когда вы хотите вставить элемент в очередь приоритетов, вы можете проверить, содержит ли он его уже, если нет, а затем добавить его как в набор, так и в очередь приоритетов. Всякий раз, когда вы удаляете элемент из очереди приоритетов, просто удалите этот элемент из набора.

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

Ответ 4

Наборы - это единственные вещи, которые игнорируют дубликаты. Списки и очереди нет. (LinkedList - это очередь)

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