Каков самый простой способ разделить список через запятую в Java?
Я знаю несколько способов сделать это, но мне интересно, какой из них лучший (где «лучший» означает самый ясный и / или самый короткий, а не самый эффективный.
У меня есть список, и я хочу перебрать его, печатая каждое значение. Я хочу вывести запятую между каждым элементом, но не после последнего (и не перед первым).
List --> Item ( , Item ) *
List --> ( Item , ) * Item
Пример раствора 1:
boolean isFirst = true;
for (Item i : list) {
if (isFirst) {
System.out.print(i); // no comma
isFirst = false;
} else {
System.out.print(", "+i); // comma
}
}
Пример решения 2 - создать подсписок:
if (list.size()>0) {
System.out.print(list.get(0)); // no comma
List theRest = list.subList(1, list.size());
for (Item i : theRest) {
System.out.print(", "+i); // comma
}
}
Пример раствора 3:
Iterator<Item> i = list.iterator();
if (i.hasNext()) {
System.out.print(i.next());
while (i.hasNext())
System.out.print(", "+i.next());
}
Они специально относятся к первому элементу; вместо этого можно было относиться к последнему специально.
Кстати, вот как List
toString
это реализовано (унаследовано от AbstractCollection
) в Java 1.6:
public String toString() {
Iterator<E> i = iterator();
if (! i.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (! i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}
Он выходит из цикла раньше, чтобы не ставить запятую после последнего элемента. Кстати: это первый раз, когда я вспоминаю, что видел "(этот сборник)"; вот код, чтобы спровоцировать это:
List l = new LinkedList();
l.add(l);
System.out.println(l);
Я приветствую любое решение, даже если оно использует неожиданные библиотеки (regexp?); а также решения на языках, отличных от Java (например, я думаю, что в Python / Ruby есть функция перемежения - как это реализовано?).
Уточнение : под библиотеками я имею в виду стандартные библиотеки Java. Что касается других библиотек, я рассматриваю их с другими языками и мне интересно узнать, как они реализованы.
В наборе инструментов EDIT упоминался аналогичный вопрос: последняя итерация расширенного цикла for в java
И еще: заслуживает ли последний элемент цикла отдельного рассмотрения?
источник
Ответы:
Java 8 и новее
Использование
StringJoiner
класса:Использование
Stream
, иCollectors
:Java 7 и ранее
См. Также # 285523
источник
источник
В Java 8 есть несколько новых способов сделать это:
join
Способ поString
.joining
Коллектор для потоков изCollectors
класса.StringJoiner
Класс.Пример:
Предполагает подход с использованием потоков
import static java.util.stream.Collectors.joining;
.источник
Столяр .
источник
Если вы используете Spring Framework, вы можете сделать это с помощью StringUtils :
источник
На основе реализации Java List toString:
Он использует такую грамматику:
Будучи основанным на последнем, а не на первом, он может проверять пропущенную запятую с помощью того же теста, чтобы проверить наличие конца списка. Я думаю, что это очень элегантно, но я не уверен в ясности.
источник
источник
Есть хороший способ добиться этого с помощью Java 8:
источник
источник
Один из вариантов цикла foreach:
источник
Обновление : как Дэйв Уэбб упомянул в комментариях, это может не дать правильных результатов, если первые элементы в списке являются пустыми строками.
источник
Я обычно так делаю:
Хотя я думаю, что с этого момента я буду проходить эту проверку в соответствии с реализацией Java;)
источник
Если вы можете использовать Groovy (который работает на JVM):
источник
(Скопируйте и вставьте мой собственный ответ отсюда .) Многие из описанных здесь решений немного чрезмерны, ИМХО, особенно те, которые полагаются на внешние библиотеки. Есть хорошая чистая, ясная идиома для создания списка, разделенного запятыми, который я всегда использовал. Он основан на условном операторе (?):
Изменить : исходное решение правильное, но неоптимальное согласно комментариям. Пробуем второй раз:
Вот и все, 4 строки кода, включая объявление массива и StringBuilder.
2-е изменение : если вы имеете дело с итератором:
источник
Я обычно использую что-то похожее на версию 3. Хорошо работает c / c ++ / bash / ...: P
источник
Я не компилировал его ... но должен работать (или быть близок к работе).
источник
Это очень коротко, очень ясно, но придает моей чувствительности ползучий ужас. Также немного неудобно адаптироваться к разным разделителям, особенно если это String (не char).
Вдохновлено: последней версией расширенного цикла for в java.
источник
источник
Item1Item2, Item3, Item4,
Мне немного нравится этот подход, который я нашел некоторое время назад в блоге. К сожалению, я не помню имя / URL блога.
Вы можете создать служебный / вспомогательный класс, который выглядит так:
Использовать вспомогательный класс просто:
источник
Поскольку ваш разделитель "," вы можете использовать любое из следующего:
Если ваш разделитель - НИЧЕГО другое, то это не сработает для вас.
источник
Мне нравится это решение:
Я предполагаю, что он также может использовать StringBuilder.
источник
На мой взгляд, это самое простое для чтения и понимания:
источник
В Python это просто
",". присоединиться (ваш список)
В C # есть статический метод класса String
String.Join (",", ваш список строк)
Извините, я не уверен насчет Java, но подумал, что отвечу, когда вы спросите о других языках. Я уверен, что в Java было бы что-то подобное.
источник
Вы также можете безоговорочно добавить строку разделителя, а после цикла удалить лишний разделитель в конце. Тогда "если список пуст, вернуть эту строку" в начале позволит вам избежать проверки в конце (так как вы не можете удалить символы из пустого списка)
Итак, действительно вопрос:
«Как вы думаете, с учетом цикла и« если »их можно соединить вместе?»
источник
источник
listToString.substring(0, listToString.length()-separator.length());
На основе самого четкого способа разделения списка через запятую (Java)?
Используя эту идею: заслуживает ли последний элемент в цикле отдельного рассмотрения?
источник
for (int i=0; i<1; i++)
наif (array.length>0)
.источник
Ни один из ответов пока не использует рекурсию ...
источник
источник
Метод
использование
Учитывая массив [1,2,3]
источник