Какой самый элегантный способ объединить список значений с разделителем в Java? - PullRequest
10 голосов
/ 29 октября 2009

Я никогда не находил изящный (э) способ сделать следующее.

Скажем, у меня есть список / массив строк.

abc
def
ghi
jkl

И я хочу объединить их в одну строку, разделенную запятой, следующим образом:

abc,def,ghi,jkl

В Java, если я напишу что-то вроде этого (простите за синтаксис),

String[] list = new String[] {"abc","def","ghi","jkl"};
String str = null;
for (String s : list)
{
   str = str + s + "," ;
}

System.out.println(str);

Я получу

abc,def,ghi,jkl,  //Notice the comma in the end

Так что я должен переписать вышеприведенный цикл for следующим образом

...
for (int i = 0; i < list.length; i++)
{
   str = str + list[i];
   if (i != list.length - 1)
   {
     str = str + ",";
   }
}
...

Можно ли сделать это более элегантно в Java?

Конечно, я бы использовал StringBuilder / Buffer для эффективности, но я хотел бы проиллюстрировать данный случай, не слишком многословно. Под элегантностью я подразумеваю решение, которое позволяет избежать уродливой (?) if проверки внутри цикла.

Ответы [ 8 ]

11 голосов
/ 29 октября 2009

Использование Класса столяров Guava (ранее google-collection) :

Joiner.on(",").join(list)

Готово.

10 голосов
/ 29 октября 2009

Вот моя версия: Уловки Java: самый быстрый способ собрать объекты в строке

StringBuilder buffer = new StringBuilder ();
String delim = "";
for (Object o: list)
{
    buffer.append (delim);
    delim = ", "; // Avoid if(); assignment is very fast!
    buffer.append (o);
}
buffer.toString ();

В качестве дополнительного бонуса: если ваш код в цикле более сложный, то этот подход даст правильные результаты без сложных if() с.

Также обратите внимание, что в современных процессорах назначение происходит только в кеше (или, вероятно, только в регистре).

Вывод: хотя этот код на первый взгляд выглядит странно, он имеет много преимуществ.

3 голосов
/ 29 октября 2009
StringBuilder builder = new StringBuilder();
for (String st: list) {
    builder.append(st).append(',');
}
builder.deleteCharAt(builder.length());
String result = builder.toString();

Не используйте «+» для строковых связей. Это медленно.

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

Могу поспорить, что есть несколько классов с именами «StringUtil», «StringsUtil», «Strings» или что-либо подобное в этих строках пути к классам любого Java-проекта среднего размера. Скорее всего, любой из них обеспечит функцию соединения. Вот несколько примеров, которые я нашел в своем проекте:

org.apache.commons.lang.StringUtils.join(...)
org.apache.wicket.util.string.Wicket.join(...)
org.compass.core.util.StringUtils.arrayToDelimitedString(...)

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

public static final MyStringUtils {
    private MyStringUtils() {}

    public static String join(Object[] list, String delim) {
        return org.apache.commons.lang.StringUtils.join(list, delim);
    }
}

Теперь это то, что я называю "элегантным";)

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

Смотрите здесь:

http://snippets.dzone.com/posts/show/91

для полного обсуждения этой темы.

0 голосов
/ 11 сентября 2014

проверьте, полезно ли это:

List<Integer> numbers=new ArrayList<Integer>();
    numbers.add(1);
    numbers.add(2);
    numbers.add(3);
    numbers.add(4);
    numbers.add(5);
    numbers.add(6);
    String str = " ";
    for(Integer s:numbers){
    str=str+s+" , ";
    }
    System.out.println(str.substring(0,str.length()-2));
0 голосов
/ 29 октября 2009
for (int i = 0; i < list.length-1; i++) {
    str = str + list[i];
    str = str + ",";    
}
str = str + list[list.length-1] 
0 голосов
/ 29 октября 2009

Я бы использовал StringBuffer для реализации этой функции. String является неизменным, поэтому каждый раз, когда вы объединяете два String s, создается новый объект.

Более эффективным является использование StringBuffer:

String[] list = new String[] {"abc","def","ghi","jkl"};
StringBuffer str = new StringBuffer();
for (String s : list) {
   str.append(s);
   str.append(",");
}
str.deleteCharAt(str.length());
System.out.println(str); //automatically invokes StringBuffer.toString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...