쉼표로 구분 된 문자열을 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(",")한 다음 반환 된 문자열 arrayArrayList사용하여 변환 할 수 있습니다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.