2015-03-14 2 views
-3

При работе с графиками я часто обнаружил, что мне нужно пропустить один элемент во время цикла. Есть ли способ сделать это без вызова оператора if в каждом цикле цикла?Пропустить один элемент расширенного цикла для цикла

пример:

private void printAll(Node<T> root){ 
     System.err.println(toString()); 
     for(Node<T> node : links.values()){ 
      if (node == root) continue; 
      node.printAll(this); 
     } 
} 

Я подозреваю, что ответа нет, но хотел бы подтвердить.

EDIT: Вопрос в том, есть ли способ перебора структуры данных, пропускающей один известный элемент без использования оператора if с расширенным циклом или каким-либо другим методом.

+0

Зачем вам нужно это подтвердить ... просто попробуйте. –

+0

if (node.equals (root)) будет работать до тех пор, пока вы правильно выполнили equals() Я предполагаю? – wonhee

+0

@ Как я могу попробовать это? Как я попытаюсь понять, что нет другого способа сделать это, не используя оператор if, чтобы пропустить один элемент? –

ответ

0

Что enhanced for loops сделать:

Его простая структура позволяет упростить код, представив на-петли, которые посещают каждый элемент массива/коллекции без явного выражения, как один идет от элемента к элементу.

Ключевое слово: each. Это означает, что each and every, а не all but one. Если вы хотите all but one (или какой-то другой вариант, как all but those meeting some criteria, вам нужно кодировать, что с условным.

Или $ БОЖЕСТВА упасите, построить новой коллекции вмещающей только то, что вы хотите, чтобы обработать то foreach что. Это вероятно, еще хуже идея, так как ему все равно придется использовать условное, чтобы построить новую коллекцию, так что вы не на самом деле получает ничего

Может быть, это было бы хороший иметь синтаксис, как:.

for (Node<T> node :in links.values() :where node != root) 
    node.printAll(this); 

(Я считаю, что LINQ предоставляет это для стабильности Microsoft), но это будет просто синтаксический сахар для того, что у вас уже есть. Код может быть короче, но вы все равно делаете такую ​​же работу под обложками.

+0

Я четко понимаю, как работает усиление для циклов. Таким образом, вы вообще не решали вопрос. –

+0

@MichaelHobbs, если вы внимательно прочитаете, я думаю, что это закрыто секцией 'keyword: every'. Это вариант «молот к голове», говорящий «нет, это невозможно» (предоставлено, Дон, возможно, мог бы сделать его более ясным). Каждый означает каждый, а не все-но-один. Если вы хотите все-но-один, вам нужно закодировать это или, $ DEITY forbid, построить новую коллекцию, содержащую только то, что вы хотите обработать, затем «foreach». – paxdiablo

+0

@Paxdiablo спасибо, это в основном то, что я думал, но хотел подтвердить. Мне пришлось повторять эту схему несколько раз и хотел убедиться, что нет лучшего способа сделать это. Если вы представите свой комментарий в качестве ответа, я его приму. –

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