Подтвердить что ты не робот

Лучшая практика: лечение первого элемента, отличного от других, при обходе коллекции

Возможный дубликат:
Обнаружение первой итерации через цикл для каждого цикла в Java

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

boolean first = true;
for(String foo: foos) {
   if(first) {
     // do first behavior
     first = false;
     continue;
   }
   // do normal behaviour
}

Мне интересно, есть ли другие более умные подходы, чем это?

4b9b3361

Ответ 1

Вы можете сделать это (но он не будет работать с массивами):

Iterator<String> it = ...
if (it.hasNext()) {
    String s = it.next();
    //first behaviour
    while (it.hasNext()) {
       //other behaviour
    }
}

Примечание: это вдохновлено классом guava Joiner.

Из любопытства я также проверил подход, используемый Apache StringUtils # join - он не обязательно применяется к вашему прецеденту, так как вам нужно иметь доступ к i-й элемент (т.е. не работает с любыми итерами):

for (int i = startIndex; i < endIndex; i++) {
    if (i > startIndex) {
        buf.append(separator);
    }
    buf.append(array[i]);
}

Ответ 2

Я сделаю это. (Предполагая, что вы используете список массивов)

Foo foo = foos.get(0);

// do first behavior

  for(int i=1;i<foos.size();i++) {
  // do normal behaviour
  }

Ответ 3

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

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

Ответ 4

Мне тоже не нравятся флагов. Это зависит от ситуации, например, если я создаю список столбцов SELECT, я использую этот трюк

StringBuilder sb = new StringBuilder();
for(String c : columns) {
    if (sb.length != 0) {
         sb.append(',');
    }
    sb.append(c);
}

поскольку вы не видите флаги