Java集合中的特殊滚动、循环队列。

4

我正在寻找与ConcurrentLinkedQueue类似的东西,但具有以下行为:

  • 当我peek()/poll()队列时,它检索HEAD,不删除它,然后随后将HEAD向TAIL移动一个节点
  • 当HEAD == TAIL时,下一次我peek()/poll()时,HEAD将被重置为其原始节点(因此具有“循环”行为)

因此,如果我像这样创建队列:

MysteryQueue<String> queue = new MysteryQueue<String>();
queue.add("A"); // The "original" HEAD
queue.add("B");
queue.add("C");
queue.add("D"); // TAIL

String str1 = queue.peek(); // Should be "A"
String str2 = queue.peek(); // Should be "B"
String str3 = queue.peek(); // Should be "C"
String str4 = queue.peek(); // Should be "D"
String str5 = queue.peek(); // Should be "A" again

通过这种方式,我可以整天偷看/轮询,队列将不断滚动通过我的队列,一遍又一遍。

JRE是否带有类似的东西?如果没有,也许在Apache Commons Collections或其他第三方库中有类似的东西?


1
这很容易自己编写。顺便说一下,peek()每次都会给你相同的值,直到你take()一个元素。 - Peter Lawrey
2个回答

6

我认为JRE中不存在这个功能。

那么Google Guava的Iterables.cycle呢?

可以尝试下面这样:

// items can be any type of java.lang.Iterable<T>
List<String> items = Lists.newArrayList("A", "B", "C", "D");
for(String item : Iterables.cycle(items)) {
    System.out.print(item);
}

将输出

A B C D A B C D A B C D ...

谢谢@wjans (+1) - 你能提供一个快速的代码示例来帮助我看到整个问题吗? - IAmYourFaja

2
你可以使用带有指向HEAD的ArrayList来实现(我不会写整个类,但是这是peek方法):
public T peek() {
    if (list.size() == 0)
        return null;
    T ret = list.get(head);
    head++;
    if (head == list.size()) {
        head = 0;
    }
    return ret;
}

您并没有详细说明add方法的具体使用方式,但是您应该可以使用ArrayList的默认add方法。


谢谢 @quazzieclodo (+1) - 但我从哪里获得head节点的访问权限? - IAmYourFaja
@TicketMonster 我不确定我完全理解你的问题,但你只需要将head初始化为0。(它只是一个int)。这个peek方法然后返回并循环那个头节点。 - quazzieclodo
啊,明白了@quazzieclodo - 但是现在我没有看到你如何推进“head”(例如“head ++”,等等)... - IAmYourFaja
@TicketMonster 啊,确实我漏掉了。抱歉,已经编辑过了。 - quazzieclodo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接