Как проверить, обрабатывает ли последний элемент итератор? - PullRequest
26 голосов
/ 09 марта 2012

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

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

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

Ответы [ 9 ]

30 голосов
/ 09 марта 2012

Вы можете проверить это так же, как вы делаете в условии while:

if ( ! iter.hasNext()) {
    // last iteration
    ...
}
30 голосов
/ 09 марта 2012

Если iter.hasNext() ложно после iter.next(), то это последний элемент.

Удачного кодирования.

12 голосов
/ 09 июня 2015

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

String previousSeparator = "";
for (String value : collection) {
  System.err.println(previousSeparator + value);
  previousSeparator = ",";
}
3 голосов
/ 09 марта 2012

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

2 голосов
/ 29 октября 2014

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

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();
}
2 голосов
/ 09 марта 2012

Используйте StrBuilder ( apache commons lang class) в качестве типа newsOrAnnouncementInsert.Затем используйте метод 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 добавляет разделитель, только если буфер в данный момент не пуст (в этом случае, если это первый раз).через цикл).

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

0 голосов
/ 09 марта 2012

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

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

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

Скажите, что это StringBuilder

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

for(String name : saarcCountries) {
    newsOrAnnouncementInsert.append(sep + newsId + name + 1);
    sep = "~!~";
} 
0 голосов
/ 09 марта 2012

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

0 голосов
/ 09 марта 2012

Как насчет этого:

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