Java делает цикл For, но также использует итератор для цикла Linked List («For, While»)? - PullRequest
1 голос
/ 08 марта 2011

Я прошу прощения за основной вопрос, но мое новшество в Java вызывает у меня некоторое разочарование, и я не могу найти элегантный способ сделать это из своих поисков.

Я хочу перебрать связанный список, используяa Для конструкции, но также есть числовой итератор, чтобы я мог разорвать цикл после определенного числа итераций.

У меня есть этот LL, через который я перебираю:

LinkedList<SearchResult> docSearch;

Я пыталсяделали это так, но тогда работала только часть итератора (результат всегда зависал в первой записи для каждой итерации)

for (SearchResult result : docSearch) while (iter2 < 50)  { 

//do stuff
iter2 = iter2 + 1;
}

Любой совет приветствуется

Ответы [ 5 ]

2 голосов
/ 08 марта 2011

Если вам нужно выполнить такую ​​проверку, я бы просто сделал это с помощью if в блоке.

for (SearchResult result : docSearch)  {
  if (iter2 >= 50) break;

  //do stuff
  iter2 += 1;
}
1 голос
/ 08 марта 2011

Будет лучше использовать обычный синтаксис for..loop для удовлетворения ваших потребностей

for (int i = 0; i < 50 && i < docSearch.getSize(); i++ ) {
    SearchResult result = docSearch.get(i);
}

То, что Java поддерживает каждый цикл, не означает, что мы должны использовать его каждый раз. Я считаю, что использование обычного синтаксиса for..loop легче читать, когда ваше состояние изолировано в 1 месте. Если вы используете for-each с break, тогда у вас есть 2 места, которые влияют на ваш поток кода.

0 голосов
/ 08 марта 2011
for (SearchResult result : docSearch)  {
  if (iter2++ >= 50) break;
  //do stuff
}

Здесь также может быть хорошее место для постинкрементации. :)

0 голосов
/ 08 марта 2011

Если вы сделаете это:

for (SearchResult result : docSearch) while (iter2 < 50)  { 

//do stuff
iter2 = iter2 + 1;
}

Это то же самое, что и это:

for (SearchResult result : docSearch) {

    while (iter2 < 50)  { 

    //do stuff
    iter2 = iter2 + 1;
    }
}

Вы можете обойти это несколькими способами. Одним из них является перерыв (хотя некоторые осуждают это как код спагетти.

for (SearchResult result : docSearch) { 
if(iter2 >= 50) break;
//do stuff
iter2 = iter2 + 1;
}

Вы можете использовать стандарт для цикла и поместить два условия в раздел условий

Iterator<SearchResult> iter = docSearch.iterator();
for(SearchResult result = iter.next(); iter.hasNext() && iter2 < 50; result = iter.next()) {
   // do stuff
   iter2 = iter2 + 1;
}
0 голосов
/ 08 марта 2011

где вы присвоили значение iter2?

try

for (SearchResult result : docSearch) 
{
  int iter2 = 0;
  while (iter2 < 50)  { 

  //do stuff
  iter2 = iter2 + 1;
  }
}
...