3

Я ищу что-то подобное ConcurrentLinkedQueue, но со следующими поведениями:Java Collection для специальной прокрутки, круговая очередь

  • Когда я peek()/poll() очереди, она извлекает ГОЛОВА, делает не удалить его, а затем последовательно продвигает глава одного узла к хвосту
  • Когда голова == ХВОСТ, следующий раз, когда я peek()/poll(), глава сбрасывается в исходном узел (таким образом, «круглое» поведение)

Так что, если я создал очередь так:

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 или какой-либо другой сторонней lib? Заранее спасибо!

+1

Это довольно просто написать себе. BTW peek() даст вам одно и то же значение каждый раз, пока вы не возьмете() элемент. –

ответ

2

Вы могли бы реализовать с помощью ArrayList с указателем на голове (я не собираюсь выписывать весь класс, но вот подглядывающий метод):

public T peek() { 
    if (list.size() == 0) 
     return null; 
    T ret = list.get(head); 
    head++; 
    if (head == list.size()) { 
     head = 0; 
    } 
    return ret; 
} 

Вы на самом деле не указали, как должен был работать доп. y, но вы должны иметь возможность использовать добавление по умолчанию из ArrayList.

+0

Спасибо @quazzieclodo (+1) - но где я могу получить доступ к узлу 'head'? – IAmYourFaja

+0

@TicketMonster Я не уверен, что получаю именно то, что вы просите, но вы просто инициализируете голову до 0. (Это просто int). Затем этот метод peek возвращает и циклизирует главный узел. – quazzieclodo

+0

Ahh, gotchya @quazzieclodo - однако теперь я не вижу, где вы продвигаете 'head' (например,' head ++ 'и т. Д.) ... – IAmYourFaja

5

Я не думаю, что он существует в 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 ... 
+0

Спасибо @wjans (+1) - можете ли вы представить пример быстрого кода, который поможет мне увидеть лес через деревья? – IAmYourFaja

 Смежные вопросы

  • Нет связанных вопросов^_^