Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最多一次提供相等元素的java.util.Queue实现_Java - Fatal编程技术网

最多一次提供相等元素的java.util.Queue实现

最多一次提供相等元素的java.util.Queue实现,java,Java,我正在寻找一个java.util.Queue实现,它最多一次对相等的元素进行排队 例如,这样一个特殊队列的行为应该是这样的: E e1; E e2; E e3; //... assertThat( e1, is(e2) ); assertThat( e1, is(not(e3)) ); Queue<E> specialQueue; //... specialQueue.offer(e1); specialQueue.offer(e2); specialQueue.offer(e3)

我正在寻找一个
java.util.Queue
实现,它最多一次对相等的元素进行排队

例如,这样一个
特殊队列
的行为应该是这样的:

E e1;
E e2;
E e3;
//...
assertThat( e1, is(e2) );
assertThat( e1, is(not(e3)) );

Queue<E> specialQueue;
//...
specialQueue.offer(e1);
specialQueue.offer(e2);
specialQueue.offer(e3);


assertThat( specialQueue.poll(), is(e1) );
assertThat( specialQueue.poll(), is(e3) );
assertThat( specialQueue.poll(), is(null) );
// FIFO semantics are not relevant to the question

specialQueue.offer(e3)
assertThat( specialQueue.poll(), is(null) );
e1;
E e2;
e3;
//...
(e1,is(e2));
(e1,is(不是(e3));
队列特殊队列;
//...
特殊队列报价(e1);
特殊队列报价(e2);
特殊队列报价(e3);
断言(specialQueue.poll(),是(e1));
断言(specialQueue.poll(),是(e3));
断言(specialQueue.poll(),为(null));
//FIFO语义与该问题无关
特殊队列。优惠(e3)
断言(specialQueue.poll(),为(null));

我提出了一个实现,它管理一个内部
集合alreadyseelements
,并通过检查该集合来防止向委托队列中添加元素。我想知道是否已经存在一个“经过战斗测试”的实现。

正如评论员所说,您描述的是一种特殊的
集合,而不是
队列。据我所知,您的要求是:

  • 插入顺序迭代
  • 集合中的每个元素都是唯一的(不相等)
  • 以前看到的元素永远不能重新添加
如图所示,
LinkedHashSet
很好地满足了前两个需求。最后一个要求非常奇怪,需要某种以前看到的值的内部存储。比如:

public class SeenOnceLinkedHashSet<E> implements Set<E> {
  private LinkedHashSet<E> data;
  private HashSet<E> seen;

  public boolean add(E e) {
    boolean newValue = seen.add(e);
    if (newValue) {
      return data.add(e);
    }

  // and so on in other methods
}
public类SeenOnceLinkedHashSet实现集合{
私有链接集数据;
私有哈希集;
公共布尔加法(E){
布尔newValue=seen.add(e);
如果(新值){
返回数据。添加(e);
}
//在其他方法中也是如此
}
请注意,该类具有无限的内部内存。使用该类很容易导致内存不足问题,而其他
Set
s可以毫无问题地处理该问题。如果您需要一些“已添加”的概念,这是不可避免的。您可以使用更优雅的方法,如a,但这会导致误报


就我个人而言,我会重新检查您的需求。任何类型的无界空间数据结构几乎肯定都是一种代码味道。例如,您是否可以使用一个包装类来提供更有用的
.equals()定义
?或者在对象构造时添加额外的安全检查,以便不首先构造坏的对象?

请看这里@Sneh,感谢您让我注意到另一个问题,这确实与我的问题非常接近。那里的答案似乎更侧重于在t中的元素输入期间元素的唯一性队列,而不是队列生存期内元素的唯一性。我认为唯一性要求破坏了队列契约。例如,如果由于容量限制而无法添加元素,queue.add必须返回true或抛出IllegalStateException。@EvgeniyDorofeev,说得好。但唯一性约束是否违反了容量约束?此外,Java类库还包括
Queue
子类,如
Java.util.ArrayDeque
,这些子类明确地删除了容量限制。如果
FIFO语义不相关,那么它如何被称为队列?