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 ...