Создание правильного строкового представления коллекции

Я часто сталкиваюсь с задачей создать строковое представление коллекции объектов.

пример:

String[] collection = {"foo", "bar", "lorem", "dolar"};

Представление, которое я хочу создать: "foo, bar, lorem, dolar".

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

Я знаю, что есть много способов получить желаемое представление, но, например, мне всегда было интересно, есть ли возможность создать строку, просто используя цикл for / each?

вот так:

StringBuilder builder = new StringBuilder();

for (String tag : list) {
  builder.append(tag + ", ");

String representation = builder.toString();
// but now the String look like this: "foo, bar, lorem, dolar, " which nobody wants

Или лучше всего использовать итератор, если он есть, напрямую?

Предположим, что список - это коллекция (вот как они это делают в JDK):

Iterator<String> it = list.iterator();
while (it.hasNext()) {
  sb.append(it.next());
  if (!it.hasNext()) {
    break;
  }
  sb.append(", ");
}

Конечно, можно было бы индексировать массив с помощью традиционного цикла for или делать многое другое.

Вопрос

Какой самый простой / наиболее читаемый / самый безопасный способ преобразовать список строк в представление, разделяя каждый элемент запятой < / strong> и обрабатывать крайний регистр в начале или в конце (это означает, что перед первым элементом или после последнего элемента нет запятой)?


person Jan    schedule 11.08.2015    source источник
comment
Если вы используете Java 8, посмотрите StringJoiner.   -  person Jon Skeet    schedule 11.08.2015
comment
Спасибо @KevinEsche ... Я действительно осмотрелся, но не нашел вопроса, на который вы указывали, и да, он охватывает многое из того, о чем я спрашивал.   -  person Jan    schedule 11.08.2015
comment
@JonSkeet Я могу использовать Java 8, я посмотрю на StringJoiner, никогда о нем не слышал, спасибо   -  person Jan    schedule 11.08.2015


Ответы (8)


С Java 8 вы можете:

String listJoined = String.join(",", list);
person Amila    schedule 11.08.2015
comment
String.join() выполнить ту же операцию StringJoiner sj=new StringJoiner(","); for(String i:list){ sj.add(i); } System.out.println(sj.toString()); - person Ruchira Gayan Ranaweera; 11.08.2015
comment
Это будет работать, если список является коллекцией, а не String [] - person Maulik Shah; 11.08.2015
comment
@MaulikShah Вы это тестировали? - person Pshemo; 11.08.2015
comment
@Amila, нужды в таком редактировании не было. String.join отлично работает с массивами: ideone.com/mKSIj8, поэтому при редактировании добавляется больше ненужной работы, что неверно. - person Pshemo; 11.08.2015
comment
Единственная проблема с join заключается в том, что он поддерживает Коллекции или массив CharSequence (например, String), а не другие нетекстовые типы. - person Pshemo; 11.08.2015
comment
@Pshemo Ты прав. - person Amila; 11.08.2015

Я думаю, что наиболее читаемым будет:

String[] collection = {"foo", "bar", "lorem", "dolar"};
String s = Arrays.asList(collection).toString();
System.out.println(s);

Вывод

[foo, bar, lorem, dolar]
person Maulik Shah    schedule 11.08.2015

Использование Java8

String joined = Stream.of(collection)
                    //.map(Object::toString) //for non-String elements
                      .collect(Collectors.joining(","));

для получения желаемого результата или String.join, как описано выше.

person col.panic    schedule 11.08.2015
comment
map(o -> o.toString()) не нужен, так как мы уже передаем элементы String, также u + "," + t очень неэффективно, потому что каждый раз нужно создавать новую строку, которая будет копией old one плюс new part. Вместо этого вы должны использовать StringBuilder / StringJoiner и добавить к нему новую часть, или, поскольку мы используем stream, просто используйте collect(Collectors.joining(delimiter)) вместо reduce. - person Pshemo; 11.08.2015

Вы можете использовать Apache Commons присоединиться

public static String join(Iterable iterable, char separator) Joins the elements of the provided Iterable into a single String containing the provided elements. No delimiter is added before or after the list. Null objects or empty strings within the iteration are represented by empty strings. See the examples here: join(Object[],char). Parameters: iterable - the Iterable providing the values to join together, may be null separator - the separator character to use Returns: the joined String, null if null iterator input

Он уже реализован в популярном пакете утилит и выполняет именно то, что вы делаете в своем коде.

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

Iterator<String> it = list.iterator();
while (it.hasNext()) {
  sb.append(it.next());
  sb.append(", ");
}
return sb.substring(0,sb.length()-1);
person usr-local-ΕΨΗΕΛΩΝ    schedule 11.08.2015

Вы можете попробовать этот способ

String[] collection = {"foo", "bar", "lorem", "dolar"};    
StringBuilder sb=new StringBuilder();
for(String i:collection){
   sb.append(i);
   sb.append(",");
}
sb.replace(sb.lastIndexOf(","),sb.lastIndexOf(",")+1,"");
System.out.println(sb.toString());

Вывод:

foo,bar,lorem,dolar

В Java 8 можно попробовать следующее.

 String[] collection = {"foo", "bar", "lorem", "dolar"};   
 StringJoiner sj=new StringJoiner(",");
 for(String i:collection){
    sj.add(i);
 }
 System.out.println(sj.toString());
person Ruchira Gayan Ranaweera    schedule 11.08.2015

вы можете использовать функцию Arrays.asList, которая превращает ваш массив в объект List.

Функция toString, примененная к списку, возвращает что-то вроде

stringCollection = "[foo, bar, lorem, dolar]"

Здесь вам просто нужно удалить первый и последний символы '[' и ']' с помощью функции подстроки.

result = "foo, bar, lorem, dolar"

//This is your String array
String[] collection = {"foo", "bar", "lorem", "dolar"};
//You convert it to a List and apply toString
String stringCollection = Arrays.asList(collection).toString(); 
//Remove the '[' and  ']' fromt the resulted String 
String result = stringCollection.substring(1, stringCollection.length()-1);
person CriPstian    schedule 11.08.2015

с использованием потоков в java8:

String[] collection = {"foo", "bar", "lorem", "dolar"};    
String output = Arrays.asList(collection ).stream().collect(Collectors.joining(", "));
person Alex    schedule 11.08.2015

Используйте общий язык Apache: StringUtils.join(collection , ',');

Еще один аналогичный вопрос и ответ здесь

person karim mohsen    schedule 11.08.2015