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, "");