исправить уродливые инициализации в цикле while по очереди


У меня есть структура петля, что мне действительно не нравится. Это инициализация я найти appalingly некрасиво. Есть ли лучше способ сделать следующее?

Queue<Integer> queue = getMyQueue();
Integer element = queue.poll();
while (element != null){
  calculate_smart_stuff(element);
  element = queue.poll();
}

Цикл for немного лучше, но все равно имеет уродливое повторение присвоение элемент в инициализации тестов и incrementer' я тоже предпочитаю для петель-очень простой, и только должны быть зарезервированы для подсчета и добавления (или вычитания в углу случаях) 1, а это, как я думаю, для петли, чтобы вести себя.

Queue<Integer> queue = getMyQueue();
for (Integer element = queue.poll(); element != null; element = queue.poll()){
  calculate_smart_stuff(element);
}

Или я должен просто продолжать проверять размер перед назначением, как так?

Queue<Integer> queue = getMyQueue();
while (queue.size() > 0){
  Integer element = queue.poll();
  calculate_smart_stuff(element);
}

Что мне не нравится в этом то, что мне нужно проверить размер каждый раз, прежде чем элемент, который сам по себе имеет явный признак того, что в очереди никого не было.

Есть ли какие лучше конструкции я могу использовать здесь, или я просто привередничаю два последних варианта?



5098
6
задан 31 мая 2011 в 06:05 Источник Поделиться
Комментарии
3 ответа

Было бы лучше сделать

for (Integer element; (element = queue.poll) != null;){

}

Потому что вы не хотите, чтобы элемент, который будет в области после того, как цикл закончился

11
ответ дан 31 мая 2011 в 09:05 Источник Поделиться

Вы можете этого не делать:

while ((element = queue.poll) != null) {
..
}

?

Это требует более глубоких знаний языка, но это может быть компромисс вам понравится.

6
ответ дан 31 мая 2011 в 07:05 Источник Поделиться

Начиная с Java.утиль.Очередь является итерируемым...

for (int i : queue)
{
System.out.println ("" + i);
}

Упрощенный цикл for, введена примерно в 2005 году.

В комментариях поднимается вопрос, Что делать с PriorityQueue, что не дает гарантии о его iterator. Ну - к сожалению, мы не можем просто написать:

for (int i : Arrays.sort (pq.toArray ()))

поскольку массивы.sort сортирует массив на месте, и не вернуть его. Поэтому мы должны заранее построить массив,

public void test () 
{
Queue <Integer> queue = new PriorityQueue <Integer> ();
queue.offer (4);
queue.offer (41);
queue.offer (44);
queue.offer (14);

for (int i : queue)
{
System.out.println ("" + i);
}

out.println ("-------------");

Integer [] arr = queue.toArray (new Integer [queue.size ()]);
Arrays.sort (arr);
for (int i : arr)
{
System.out.println ("" + i);
}
}

То есть, конечно, более шаблонного, чем на вопрос. В то время как я спрашиваю себя, почему итератор в PriorityQueue не гарантирует порядок, и предложил бы сделать иначе, если вы пишете свои собственные очереди, где вы можете перезаписать 'итератор', где вас интересует порядок итерации, у меня нет предложения для тривиального случая.

0
ответ дан 1 июня 2011 в 03:06 Источник Поделиться