[java] 목록을 쉼표로 구분하는 가장 간단한 방법은 무엇입니까?

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자바 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(", ");
    }
}

마지막 항목 뒤의 쉼표를 피하기 위해 루프를 일찍 종료합니다. BTW : “(이 컬렉션)”을 본 것은 이번이 처음입니다. 그것을 유발하는 코드는 다음과 같습니다.

List l = new LinkedList();
l.add(l);
System.out.println(l);

예기치 않은 라이브러리 (regexp?)를 사용하더라도 모든 솔루션을 환영합니다. 자바 이외의 언어로도 솔루션 (예를 들어 파이썬 / 루비가 생각 산재 기능 – 방법 있음 ? 구현을).

설명 : 라이브러리 란 표준 Java 라이브러리를 의미합니다. 다른 라이브러리의 경우 다른 언어로 고려하고 구현 방법을 알고 싶습니다.

EDIT 툴킷이 비슷한 질문을 언급했습니다. 자바에서 향상된 for 루프의 마지막 반복

그리고 또 다른 :
루프의 마지막 요소는 별도의 처리가 필요합니까?



답변

Java 8 이상

StringJoiner수업 사용 :

StringJoiner joiner = new StringJoiner(",");
for (Item item : list) {
    joiner.add(item.toString());
}
return joiner.toString();

Stream, 및 사용 Collectors:

return list.stream().
       map(Object::toString).
       collect(Collectors.joining(",")).toString();

Java 7 이하

참조 # 285523

String delim = "";
for (Item i : list) {
    sb.append(delim).append(i);
    delim = ",";
}


답변

org.apache.commons.lang3.StringUtils.join(list,",");


답변

Java 8은이를위한 몇 가지 새로운 방법을 제공합니다.

  • join방법 String.
  • 클래스의 joining스트림에 대한 수집기입니다 Collectors.
  • StringJoiner클래스입니다.

예:

// Util method for strings and other char sequences
List<String> strs = Arrays.asList("1", "2", "3");
String listStr1 = String.join(",", strs);

// For any type using streams and collectors
List<Object> objs = Arrays.asList(1, 2, 3);
String listStr2 = objs.stream()
    .map(Object::toString)
    .collect(joining(",", "[", "]"));

// Using the new StringJoiner class
StringJoiner joiner = new StringJoiner(", ", "[", "]");
joiner.setEmptyValue("<empty>");
for (Integer i : objs) {
  joiner.add(i.toString());
}
String listStr3 = joiner.toString();

스트림을 사용하는 접근 방식은 import static java.util.stream.Collectors.joining;.


답변

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

결합 자 .


답변

Spring Framework를 사용한다면 StringUtils로 할 수 있습니다 .

public static String arrayToDelimitedString(Object[] arr)
public static String arrayToDelimitedString(Object[] arr, String delim)
public static String collectionToCommaDelimitedString(Collection coll)
public static String collectionToCommaDelimitedString(Collection coll, String delim)


답변

Java의 List toString 구현을 기반으로 :

Iterator i = list.iterator();
for (;;) {
  sb.append(i.next());
  if (! i.hasNext()) break;
  ab.append(", ");
}

다음과 같은 문법을 사용합니다.

List --> (Item , )* Item

첫 번째 기반이 아닌 마지막 기반이기 때문에 목록 끝을 확인하기 위해 동일한 테스트로 쉼표 건너 뛰기를 확인할 수 있습니다. 나는 이것이 매우 우아하다고 생각하지만 명확성이 확실하지 않습니다.


답변

String delimiter = ",";
StringBuilder sb = new StringBuilder();
for (Item i : list) {
    sb.append(delimiter).append(i);
}
sb.toString().replaceFirst(delimiter, "");