Лучшая практика: лечение первого элемента, отличного от других, при обходе коллекции
Возможный дубликат:
Обнаружение первой итерации через цикл для каждого цикла в Java
Привет, когда вы перебираете коллекцию, я хочу найти самый умный способ генерировать другое поведение только для первого элемента коллекции. Я сталкиваюсь с этой проблемой очень часто и чувствую, что мое решение не лучшее:
boolean first = true;
for(String foo: foos) {
if(first) {
// do first behavior
first = false;
continue;
}
// do normal behaviour
}
Мне интересно, есть ли другие более умные подходы, чем это?
Ответы
Ответ 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);
}
поскольку вы не видите флаги