쉼표로 구분 된 문자열을 ArrayList로 변환하는 방법?


538

쉼표로 구분 된 문자열을 일부 컨테이너 (예 : 배열, 목록 또는 벡터)로 변환 할 수있는 내장 메소드가 Java에 있습니까? 아니면이를 위해 사용자 지정 코드를 작성해야합니까?

String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = //method that converts above string into list??


@Raedwald 그것은 OP가 요구 한 것이 아닙니다
— Crowie

3
질문 제목과 같이 ArrayList를 원한다고 가정 할 때 ColinD의 대답 만 정확합니다. ArrayList (변경 가능)는 List와 완전히 다르며 간단한 고정 목록 일 수 있습니다.
— Fattie

@Fattie - 공정 포인트, 고정이 - stackoverflow.com/a/34735419/744133
— 유유

답변:


1016

쉼표로 구분 된 문자열을 목록으로 변환

List<String> items = Arrays.asList(str.split("\\s*,\\s*"));

위의 코드는 다음과 같이 정의 된 구분 기호로 문자열을 분할합니다. 이렇게 zero or more whitespace, a literal comma, zero or more whitespace하면 단어가 목록에 배치되고 단어와 쉼표 사이의 공백이 축소됩니다.


유의하시기 바랍니다 단순히이 반환 배열에 래퍼 : 당신 CAN NOT 예를 들어 .remove()결과에서 List. 실제로 ArrayList는 추가로 사용해야 new ArrayList<String>합니다.


39
@rosch 정규식 (정규식)입니다. \s공백이 있으면 *일치는 0 번 이상 일치합니다. 따라서 \s*"공백을 0 번 이상 일치"를 의미합니다. 쉼표 앞뒤로 이것을 찾습니다. 따라서, 분할과 같은 문자열을 작동 "item1 , item2 , item3", 또는 "item1,item2 ,item3"당신이 얻을 수 있도록, 등 자바, 당신은 문자열에서 백 슬래시를 이스케이프 할 필요가\\s*
— andrewrjones

9
"[\\s,]+"값의 공백을 자르는 데 사용 하는 것이 좋습니다 . 예를 들어 " item1 , item2 , item3 , "됩니다 ["item1", "item2", "item3"].
— Andrii Nemchenko

5
"[\\s,]+"또한 쉼표로 구분 된 토큰 내에서 내부 공간으로 분할됩니다. 쉼표와 주변 공백을 사용하는 대신 쉼표가없는 경우에도 공백을 구분 기호로 처리합니다. "\\s*(,\\s*)+"쉼표로 구분 된 토큰 주위에서만 공백을 자르고 공백이거나 비어있는 문자열도 무시합니다.
— theferrit32

2
참고 사항 : 빈 입력 문자열의 경우 빈 목록을 얻으려면이 방법이 사용 사례에 적합하지 않습니다. 빈 문자열을 포함하는 요소가 1 개인 목록이 표시됩니다.
— Madis Pukkonen

3
@AlexR OP를 존중하는 것에 감사하지만, 그런 말을하지는 않겠습니다. 나는 거짓으로 칭찬 할 때 사람들의 기대를 충족시키지 못한 것에 대해 기분이 나쁜 사람들을 알고 있습니다. 그냥 생각이야

199

Arrays.asList 고정 크기를 반환 List배열이 지원 . 정상적인 변경 가능을 원하면 java.util.ArrayList다음을 수행해야합니다.

List<String> list = new ArrayList<String>(Arrays.asList(string.split(" , ")));

또는 구아바를 :

List<String> list = Lists.newArrayList(Splitter.on(" , ").split(string));

를 사용 Splitter하면 문자열을 분할하는 방법에 더 많은 유연성을 제공하고 예를 들어 결과에서 빈 문자열을 건너 뛰고 결과를자를 수 있습니다. 또한 String.split정규 표현식으로 나눌 필요 가없는 것보다 이상한 행동이 적습니다 (단 하나의 옵션 일뿐입니다).


6
Splitter.on ( ","). trimResults (). split (string) 을 선호했을 것입니다. 그래서 +1
— John B

10
Arrays.asList가 일반 목록을 반환하지 않음을 지적하기 위해 +1. 해당 목록에 요소를 추가하거나 제거하려고하면 UnsupportedOperationException이 발생합니다.
— Alfredo Osorio

9
구아바는 이제 (15.0) 이후로 이것을 가지고 있습니다 : Splitter.on ( ","). splitToList (string) . 작은 단계를 저장합니다.
— Kango_V

다음과 같이 String을 사용하면 String iike에 빈 값을 추가 할 수있는 방법이 있습니까? 1, 3, 4, 5 여기에 2가 없거나 비어 있습니다. 목록 2에서 변환하면 건너 뜁니다. 그러나 이것을 빈 값으로 추가하고 싶습니다.
— A.Aleem11

이 구현과 다른 유사한 예의 문제점은 비록 Arrays.asList기본 배열 주위에 래퍼를 제공 하지만 (요소 복사를 피함), new ArrayList(...)요소별로 복사를 수행 한다는 것입니다. 구문 분석 된 요소를 원하는 대상 컬렉션에 직접 추가 할 수있는 접근 방식을 선호해야합니다.
— YoYo

70

두 단계 :

  1. String [] items = commaSeparated.split("\\s*,\\s*");
  2. List<String> container = Arrays.asList(items);

1
items 변수를 인라인하면 기본적으로 다른 답변과 동일하지만 정규 표현식을 사용하지 않기 때문에 실제로 조금 더 효율적입니다. 반대로 쉼표 주위의 공백은이 옵션을 종료시킵니다.
— Amrinder Arora

2
@AmrinderArora 인수 split는 RegEx로 해석됩니다.
— Madbreaks

23

CSV를 ArrayList로 변환하는 또 다른 방법은 다음과 같습니다.

String str="string,with,comma";
ArrayList aList= new ArrayList(Arrays.asList(str.split(",")));
for(int i=0;i<aList.size();i++)
{
    System.out.println(" -->"+aList.get(i));
}

당신을 인쇄합니다

-> 문자열
->와
-> 쉼표


21

ListOP가 언급 한대로 a 가 최종 목표 인 경우 , 이미 승인 된 답변이 여전히 가장 짧고 가장 좋습니다. 그러나 Java 8 Streams를 사용하는 대안을 제공하고 싶습니다 . 추가 처리를위한 파이프 라인의 일부인 경우 더 많은 이점을 제공합니다.

.split 함수 (기본 배열)의 결과를 스트림에 래핑 한 다음 목록으로 변환합니다.

List<String> list =
  Stream.of("a,b,c".split(","))
  .collect(Collectors.toList());

ArrayListOP의 제목에 따라 결과를 저장 해야하는 경우 다른 Collector방법을 사용할 수 있습니다 .

ArrayList<String> list = 
  Stream.of("a,b,c".split(","))
  .collect(Collectors.toCollection(ArrayList<String>::new));

또는 RegEx 구문 분석 API를 사용하여 :

ArrayList<String> list = 
  Pattern.compile(",")
  .splitAsStream("a,b,c")
  .collect(Collectors.toCollection(ArrayList<String>::new));

list변수 List<String>대신을 입력 한 상태로 두는 것도 고려할 수 있습니다 ArrayList<String>. 에 대한 일반적인 인터페이스는 List여전히 ArrayList구현 과 충분히 유사합니다 .

이 코드 예제 자체는 많은 것을 추가하지 않는 것 같습니다 (더 많은 타이핑 제외) . 문자열을 Longs List로 변환하는 것에 대한이 답변 과 같이 더 많은 것을 계획하고 있다면 스트리밍 API는 실제로 강력합니다. 작업을 차례로 파이프 라인

완전성을 위해 알다시피


19
List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(toList());

1
최고의 답변 중 하나입니다. 이 답변 +1에서 목록을 변경할 수 있습니다.
— Sedrick

변경 후 작동 collect(toList())에collect(Collectors.toList()
— Sundararaj Govindasamy

사실 간결하고 유창한 collect(toList())정적 가져 오기를 사용하고 있습니다 Collectors.toList():)
— Manu

15

이것에 대한 내장 메소드는 없지만 간단히 split () 메소드를 사용할 수 있습니다.

String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = 
new  ArrayList<String>(Arrays.asList(commaSeparated.split(",")));

14
List<String> items = Arrays.asList(commaSeparated.split(","));

그것은 당신을 위해 작동합니다.


10

asList와 split을 결합 할 수 있습니다

Arrays.asList(CommaSeparated.split("\\s*,\\s*"))

8

이 코드는 도움이 될 것입니다.

String myStr = "item1,item2,item3";
List myList = Arrays.asList(myStr.split(","));

5

Guava를 사용하여 문자열을 분할하고 ArrayList로 변환 할 수 있습니다. 이것은 빈 문자열에서도 작동하며 빈 목록을 반환합니다.

import com.google.common.base.Splitter;
import com.google.common.collect.Lists;

String commaSeparated = "item1 , item2 , item3";

// Split string into list, trimming each item and removing empty items
ArrayList<String> list = Lists.newArrayList(Splitter.on(',').trimResults().omitEmptyStrings().splitToList(commaSeparated));
System.out.println(list);

list.add("another item");
System.out.println(list);

다음을 출력합니다.

[item1, item2, item3]
[item1, item2, item3, another item]

4

를 사용하는 예 Collections입니다.

import java.util.Collections;
 ...
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = new ArrayList<>();
Collections.addAll(items, commaSeparated.split("\\s*,\\s*"));
 ...

1
중간 Arrays.asList를 피했습니다. 불행히도 우리는 여전히 배열 요소에서 컬렉션으로 복사본을 가지고 있습니다. 기억하기에 좋은 대안.
— YoYo

4

Java 8 에서 스트림을 사용하여이를 해결하는 방법은 여러 가지가 있지만 IMO는 다음과 같은 하나의 라이너가 간단합니다.

String  commaSeparated = "item1 , item2 , item3";
List<String> result1 = Arrays.stream(commaSeparated.split(" , "))
                                             .collect(Collectors.toList());
List<String> result2 = Stream.of(commaSeparated.split(" , "))
                                             .collect(Collectors.toList());

누구든지이 문자열을 쉼표로 구분 된 목록으로 변환하는 방법을 알고 있습니까? --String s = "2017-07-12 23 : 40 : 00.0,153.76,16.140,60.00,, 56.00,"; List <String> splittedString = 새 ArrayList <String> (Arrays.asList (s.split ( "\\ s *, \\ s *")));
— Sunny

1
이것은 새로운 질문이므로 의견으로 묻지 마십시오. 새로운 질문을 작성하십시오.
— George Siggouroglou 2016 년

2

먼저을 사용하여 분할 String.split(",")한 다음 반환 된 문자열 array을 ArrayList사용하여 변환 할 수 있습니다Arrays.asList(array)


2

groovy에서는 tokenize (Character Token) 방법을 사용할 수 있습니다.

list = str.tokenize(',')

이것은 나를 구했다! 감사합니다.
— tamerlaha

2

Splitter 클래스를 사용하여 동일한 결과를 얻을 수 있습니다.

var list = Splitter.on(",").splitToList(YourStringVariable)

(kotlin으로 작성)


1
설명서에 따르면이 기능은 베타 버전이며 불안정합니다.
— Rubberducker

1
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));

// enter code here

1

나는 일반적으로 목록에 미리 컴파일 된 패턴을 사용합니다. 또한 이것은 listToString 표현식 중 일부를 따르는 대괄호를 고려할 수 있기 때문에 약간 더 보편적입니다.

private static final Pattern listAsString = Pattern.compile("^\\[?([^\\[\\]]*)\\]?$");

private List<String> getList(String value) {
  Matcher matcher = listAsString.matcher((String) value);
  if (matcher.matches()) {
    String[] split = matcher.group(matcher.groupCount()).split("\\s*,\\s*");
    return new ArrayList<>(Arrays.asList(split));
  }
  return Collections.emptyList();

1

Kotlin에서 문자열 목록이 이와 같고 문자열을 ArrayList로 변환하는 데 사용할 수있는 경우이 코드 줄을 사용하십시오

var str= "item1, item2, item3, item4"
var itemsList = str.split(", ")


0

다음과 같이 할 수 있습니다.

공백을 제거 할 필요가없는 경우 공백을 제거하고 쉼표로 분할합니다.

    String myString= "A, B, C, D";

    //Remove whitespace and split by comma 
    List<String> finalString= Arrays.asList(myString.split("\\s*,\\s*"));

    System.out.println(finalString);

-1

문자열-> 콜렉션 변환 : (문자열-> 문자열 []-> 콜렉션)

//         java version 8

String str = "aa,bb,cc,dd,aa,ss,bb,ee,aa,zz,dd,ff,hh";

//          Collection,
//          Set , List,
//      HashSet , ArrayList ...
// (____________________________)
// ||                          ||
// \/                          \/
Collection<String> col = new HashSet<>(Stream.of(str.split(",")).collect(Collectors.toList()));

콜렉션-> 문자열 [] 변환 :

String[] se = col.toArray(new String[col.size()]);

문자열-> 문자열 [] 변환 :

String[] strArr = str.split(",");

그리고 수집-> 수집 :

List<String> list = new LinkedList<>(col);

-2

Java 8 에서 쉼표로 구분하여 Collection을 문자열로 변환

listOfString 객체에는 [ "A", "B", "C", "D"] 요소가 포함됩니다.

listOfString.stream().map(ele->"'"+ele+"'").collect(Collectors.joining(","))

출력은 :- 'A', 'B', 'C', 'D'

Java 8에서 문자열 배열을 목록으로 변환

    String string[] ={"A","B","C","D"};
    List<String> listOfString = Stream.of(string).collect(Collectors.toList());

-4
ArrayList<HashMap<String, String>> mListmain = new ArrayList<HashMap<String, String>>(); 
String marray[]= mListmain.split(",");

5
그리고 정확히 어디에 ArrayList있습니까? 질문을 읽었습니까?
— Debosmit Ray

@mapeters :이있었습니다 ArrayList. 편집 내용을 첫 번째 개정판으로 롤백하고 (볼 수 있음) 첫 번째 개정판의 형식을 개선했습니다.
— dur

질문은 ArrayList를 Array로 변환하는 방법이 아니라 문자열을 ArrayList로 변환하는 방법입니다.
— 동지
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.