Упростить цикл


Что бы ваш предпочтительный тип петли необходимо для такой случай:

StringBuilder sb = new StringBuilder();
for(Integer id : idList) {
    sb.append("?,");
}

Короче: в зависимости от размера списка я хочу добавить материал в строку. Приведенный выше пример создает "неиспользуемые переменные" предупреждение.

Я думаю из этих вариантов:

for(int i=0; i<idList.size(); i++) {
    // ...
}

Мне не нравится все лишние вписав туда...

Iterator it = idList.iterator();
while(it.hasNext()) {
    // ...
    it.next();
}

Сам в петлю голову выглядит красиво, но я в конечном итоге набрав много лишнего кода (получение итератора, переходя к следующему элементу...)

Что я хотел бы сделать бы что-то вроде этого:

for(idList) {
    // ...
}

Есть ли лучший стиль/что это лучший стиль для такой петли?



1484
8
задан 23 июня 2011 в 09:06 Источник Поделиться
Комментарии
5 ответов

Я бы использовать "нормальные" строки повторяют способ:

String s = repeat("?,", idList.size());

К сожалению, Java не имеют такой способ в стандартном API. Так что вы могли бы написать его самостоятельно:

String repeat(String s, count i) {
StringBuilder sb = new StringBuilder();
while (i-- > 0) {
ab.append(s);
}
return sb.toString();
}

или использовать один предоставленную нескольких "стандартных АДД-Апис", таких как Apache Commons лицензии StringUtils.повтор().

15
ответ дан 23 июня 2011 в 10:06 Источник Поделиться

Второй пример является ярчайшим выражая свои намерения. Вы хотите сделать что-то количество раз, в данном случае, idList.размер().

for( int i = 0; i < idList.size(); ++i ) {
// ...
}

В третьем вы просто пишете, что первый пример уже создает, так что это точно не улучшение.

Вы верно подметили, что цикл for-это довольно большая конструкция кода, чтобы выразить просто выполнение части кода количество раз. Руби раз оператор сделана именно для этой цели. В других языках есть некоторые конструкты доступен код, который может помочь вам. Методы расширения в C# позволяют создавать подобный оператор как раз оператор Руби.

Для Java я не верю более лаконичный синтаксис-это возможно, поскольку закрытия не поддерживается в Java по умолчанию.


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

6
ответ дан 23 июня 2011 в 10:06 Источник Поделиться

Я предлагаю использовать струны.повтор() из Google гуава библиотеки:

String result = Strings.repeat("?,", idList.size());

4
ответ дан 23 июня 2011 в 11:06 Источник Поделиться

Я бы пошел с первым вариантом и использовать @SuppressWarnings.

Если вам нужен этот шаблон чаще, как об объектно-ориентированный решение:

public static class Repeat<T> implements Iterable<T> {
private final T[] ts;
private final int n;

public Repeat(int n, T ... ts) {
this.ts = ts;
this.n = n;
}

public Iterator<T> iterator() {
return new Iterator<T>() {
int count = 0;

public boolean hasNext() {
return count < n;
}

public T next() {
if (! hasNext()) {
throw new NoSuchElementException();
}
return ts[(count++) % ts.length];
}

public void remove() {
throw new UnsupportedOperationException("Not supported yet.");
}

};
}
public static <U> Repeat<U> repeat(int n, U ... us) {
return new Repeat<U>(n, us);
}
}

//usage
import static blabla.Repeat.*;
...
for(String s : repeat(idList.size(), "?,")) {
sb.append(s);
}

1
ответ дан 23 июня 2011 в 10:06 Источник Поделиться

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

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

int size = idList.size();
for (int i = 0; i < size; ++i) {...}

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

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

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

1
ответ дан 24 июня 2011 в 11:06 Источник Поделиться