确保元素唯一性的队列?

我正在寻找java.util.Queue的实现或Google集合中的行为类似于队列的东西,但也要确保队列的每个元素都是唯一的。(所有进一步插入将不起作用)

这是可能的,还是我必须手工完成?

现在,我正在使用具有LinkedList实现的队列,并在插入之前检查唯一性。(我使用侧图来执行此操作,在队列之前/之后从侧映射中添加/删除元素)。我不太喜欢它。

欢迎任何意见。如果它不在java.util包中,那么也许这是一个坏主意?


答案 1

LinkedHashSet怎么样?它的迭代器保留了插入顺序,但由于它是一个,所以它的元素是唯一的。Set

正如其文件所说,

请注意,如果将元素重新插入到广告集中,广告订单受影响。

为了有效地从此“队列”的头部删除元素,请通过其迭代器:

Iterator<?> i = queue.iterator();
...
Object next = i.next();
i.remove();

答案 2

据我所知,这并不存在,但是使用 a 与 : 结合使用 a 实现会相当简单:LinkedListSet

/**
 * Thread unsafe implementation of UniqueQueue.
 */
public class UniqueQueue<T> implements Queue<T> {
  private final Queue<T> queue = new LinkedList<T>();
  private final Set<T> set = new HashSet<T>();

  public boolean add(T t) {
    // Only add element to queue if the set does not contain the specified element.
    if (set.add(t)) {
      queue.add(t);
    }

    return true; // Must always return true as per API def.
  }

  public T remove() throws NoSuchElementException {
    T ret = queue.remove();
    set.remove(ret);
    return ret;
  }

  // TODO: Implement other Queue methods.
}

推荐