Я пытаюсь сделать неизменяемую очередь приоритетов с помощью библиотеки Guava. В качестве «backend» в очереди я использовал ImmutableSortedMultiset. Но у меня проблема с производительностью - толчок работы и поп очень медленные. Каков наилучший способ добавить и удалить отдельный элемент из сортированной неизменяемой коллекции? Спасибо!Неизменяемая очередь приоритетов в Guava
Это мой код:
public class ImmutablePriorityQueue<T extends Comparable<T>> implements PriorityQueue<T> {
private final ImmutableSortedMultiset<T> multiset;
private ImmutablePriorityQueue() {
this(ImmutableSortedMultiset.<T>of());
}
private ImmutablePriorityQueue(ImmutableSortedMultiset<T> multiset) {
this.multiset = multiset;
}
public static <T extends Comparable<T>> PriorityQueue<T> createEmpty() {
return new ImmutablePriorityQueue<T>();
}
@Override
public T peek() {
if (isEmpty()) throw new EmptyCollectionException();
return multiset.firstEntry().getElement();
}
@Override
public PriorityQueue<T> push(T element) {
ImmutableSortedMultiset.Builder<T> builder = multiset.naturalOrder();
return new ImmutablePriorityQueue<T>(builder.add(element).addAll(multiset.asList()).build());
}
@Override
public PriorityQueue<T> pop() {
if (isEmpty()) throw new EmptyCollectionException();
ImmutableSortedMultiset.Builder<T> builder = multiset.naturalOrder();
return new ImmutablePriorityQueue<T>(builder.addAll(multiset.asList().subList(1, size())).build());
}
@Override
public PriorityQueue<T> clear() {
return new ImmutablePriorityQueue<T>();
}
@Override
public int size() {
return multiset.size();
}
@Override
public boolean isEmpty() {
return multiset.isEmpty();
}
}
В чем смысл метода pop()? Он даже не возвращает элемент, который был выбит? И почему бы существовать метод push() и pop() в * неизменяемой * очереди? Adn зачем использовать мультимножество для реализации очереди? Я думаю, вы на неправильном пути. Чего вы хотите достичь в этой очереди? –
@JBNizet Я полагаю, что OP использует отсортированный мультимножество, потому что его нужно сортировать, и один и тот же элемент может быть в множестве несколько раз. Я согласен с другими вашими соображениями. –
Я хочу неизменный объект - очередь приоритетов. Вот почему я реализовал методы push и pop. Эти методы типичны для очереди приоритетов. Как я могу добавить отдельный элемент в отсортированную неизменяемую коллекцию? Каков наилучший способ? Метод pop удаляется первым (с наивысшим приоритетом) элементом из очереди приоритетов. –