Java Collection для специальной прокрутки, круговой очереди

Я ищу что-то похожее на ConcurrentLinkedQueue, но со следующим поведением:

  • Когда я peek() / poll() очередь извлекает ГОЛОВУ, не удаляет ее, а затем последовательно продвигает ГОЛОВУ на один узел к ХВОСТУ
  • Когда ГОЛОВА == ХВОСТ, в следующий раз я 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 или в какой-либо другой третьей стороне? Заранее спасибо!

2 ответа

Решение

Вы могли бы реализовать, используя ArrayList с указателем на HEAD (я не собираюсь выписывать весь класс, но вот метод 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.

Я не думаю, что это существует в JRE.

Как насчет Google Guava's 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 ...
Другие вопросы по тегам