2012-03-09 3 views
22

Если у меня есть итератор, и я хочу проверить последнее значение, как я могу его проверить? КакКак проверить, обрабатывает ли последний элемент в Iterator?

private Set<String> saarcCountries = new TreeSet<String>(); 
Iterator iter = saarcCountries.iterator(); 

while(iter.hasNext()) { 

    String name = (String)iter.next(); 
    int countryId = Integer.parseInt(name); 

    newsOrAnnouncementInsert.add(newsId); 
    newsOrAnnouncementInsert.add(countryId); 
    newsOrAnnouncementInsert.add(1);   //addby 

    if (!(last value in iterator))) { 
     newsOrAnnouncementInsert.add("~!~");//Delimiter for Multiple Detail Records 
    }//end if 

} //end of while 

Как проверить последнее значение. что должно заменить последнее значение в итераторе?

+0

Заканчивать этот, а http://stackoverflow.com/questions/285523/last-iteration-of-for-loop-in-java –

ответ

27

Вы можете проверить это так же, как и вы в состоянии while:

if (! iter.hasNext()) { 
    // last iteration 
    ... 
} 
27

Если iter.hasNext() является ошибочным послеiter.next(), то это последний элемент.

Счастливое кодирование.

0

Как об этом:

if (!(iter.hasNext())) { 
    newsOrAnnouncementInsert.add("~!~");//Delimiter for Multiple Detail Records 
} 
3

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

+3

"Ewwwww!" Это просто заставляет меня думать об ужасной поддержке присоединения строк в java :( –

+0

@pst - Возможно, но я стараюсь избегать ветвей, когда могу. – MByD

+1

Не будет работать для пустого набора. – mirelon

0

Вы можете использовать метод hasNext, чтобы проверить, если это последнее значение. Если у вас нет следующих значений, это означает, что это последнее значение.

2

Используйте StrBuilder (класс apache commons lang) как тип новостейOrAnnouncementInsert. Затем используйте метод StrBuilder.appendSeperator().

Например

StrBuilder newsOrAnnouncementInsert = new StrBuilder(); 

while (iterator.hasNext()) 
{ 
    newsOrAnnouncementInsert.appendSeperator("~!~"); 

    String name = (String)iter.next(); 
    int countryId = Integer.parseInt(name); 

    newsOrAnnouncementInsert.add(newsId); 
    newsOrAnnouncementInsert.add(countryId); 
    newsOrAnnouncementInsert.add(1); 
} 

appendSeperator только добавляет Seperator, если буфер не пуст (в данном случае, если это первый раз через петлю).

В принципе, вы хотите инвертировать сравнение. Не проверяйте, находитесь ли вы в последнем элементе itnerator, вместо этого проверьте, чтобы вы не обрабатывали первый элемент. Если не первый элемент, добавьте сепаратор, а затем добавьте текущий элемент.

+0

Спасибо, но мне нужна библиотека для использования ** StrBuilder **. Anyways thanks :) – Basit

0

Если у вас нет доступа к Iterator, вы можете использовать этот подход.

boolean afterFirst = false; 
for(String name : saarcCountries) { 
    if(afterFirst) 
     newsOrAnnouncementInsert.add("~!~"); 
    afterFirst = true; 

    newsOrAnnouncementInsert.add(newsId); 
    newsOrAnnouncementInsert.add(name); 
    newsOrAnnouncementInsert.add(1); 
} 

Say Сво StringBuilder

StringBuilder newsOrAnnouncementInsert = new StringBuidler(); 
String sep = ""; 

for(String name : saarcCountries) { 
    newsOrAnnouncementInsert.append(sep + newsId + name + 1); 
    sep = "~!~"; 
} 
2

Этот вопрос стар, ответ хороший, но я использовал этот ответ, чтобы выяснить, как добавить запятые между пунктами списка и добавить конец списка разделителей , В случае, если кто-то вроде меня ищет то же самое, вот что я сделал:

public String toString() { 

    StringBuilder sb = new StringBuilder(); 

    sb.append("List contains:\n"); 

    Iterator<String> iterator = list.iterator(); 

    while(iterator.hasNext()){ 

     // Get the next element. 
     sb.append(iterator.next()); 

     // If there is another element add a comma. 
     if(iterator.hasNext()){ 
      sb.append(", "); 
     }else{ 
      sb.append(" ~!~"); 
     } 
    } 

    return sb.toString(); 
} 
10

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

String previousSeparator = ""; 
for (String value : collection) { 
    System.err.println(previousSeparator + value); 
    previousSeparator = ","; 
} 
+0

Приятный и простой. Интересно, почему эта общая проблема не имеет стандартного решения? Вероятно, это в одной из многих библиотек, я просто этого не знаю. – jackthehipster