Como converter String separada por vírgula em ArrayList?

538

Existe algum método interno em Java que nos permita converter String separada por vírgula em algum contêiner (por exemplo, matriz, Lista ou Vetor)? Ou preciso escrever um código personalizado para isso?

String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = //method that converts above string into list??
Jame
fonte
Se você deseja analisar o CSV, consulte stackoverflow.com/questions/3908012/parsing-csv-in-java #
21414
@Raedwald Isso não é o OP pediu que
Crowie
3
SOMENTE a resposta do ColinD está correta aqui, supondo que você queira uma ArrayList como no título da pergunta. ArrayList (que é mutável) é totalmente diferente de List, que pode ser apenas uma simples lista fixa.
Fattie
@Fattie - ponto justo e consertou isso - stackoverflow.com/a/34735419/744133
YoYo
1
Solução Java 8: stackoverflow.com/a/46485179/1216775
akhil_mittal

Respostas:

1016

Converter String separada por vírgula em Lista

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

O código acima divide a string em um delimitador definido como: zero or more whitespace, a literal comma, zero or more whitespaceque colocará as palavras na lista e recolherá qualquer espaço em branco entre as palavras e vírgulas.


Observe que isso retorna simplesmente um invólucro em uma matriz: você não pode, por exemplo, a .remove()partir do resultado List. Para um real, ArrayListvocê deve usar ainda mais new ArrayList<String>.

AlexR
fonte
39
@rosch É uma expressão regular (regex). \scorresponde a qualquer espaço em branco, *aplica a correspondência zero ou mais vezes. Então, \s*significa "corresponder a qualquer espaço em branco zero ou mais vezes". Procuramos isso antes e depois da vírgula. Portanto, a divisão irá trabalhar para strings como "item1 , item2 , item3", ou "item1,item2 ,item3", etc. Em Java, você precisa escapar a barra invertida em cordas, de modo a obter\\s*
andrewrjones
9
Sugiro usar "[\\s,]+"para aparar espaços em branco para valores. Por exemplo, " item1 , item2 , item3 , "torna-se ["item1", "item2", "item3"].
Andrii Nemchenko 21/03
5
"[\\s,]+"também dividirá no espaço interno dentro de um token separado por vírgula, tratará o espaço em branco como um delimitador, mesmo quando uma vírgula não estiver presente, em vez de uma vírgula mais qualquer número de espaço em branco circundante. "\\s*(,\\s*)+"aparará o espaço em branco somente em torno de tokens separados por vírgula e também ignorará quaisquer cadeias de caracteres que estejam apenas em branco ou em branco.
theferrit32
2
Como uma observação lateral: se você espera obter uma lista vazia no caso de uma sequência de entrada vazia, esse método não se adequa ao seu caso de uso. Você receberá uma lista com 1 elemento contendo uma string vazia.
Madis Pukkonen 28/09
3
@AlexR Embora eu aprecie que você respeite o OP, mas evitaria dizer essas coisas. Conheço pessoas que se sentem mal por não atender às expectativas das pessoas quando elogiadas falsamente. Apenas um pensamento.
199

Arrays.asListretorna um tamanho fixo Listapoiado pela matriz. Se você quiser um mutável normal, java.util.ArrayListprecisará fazer o seguinte:

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

Ou, usando o Goiaba :

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

O uso de a Splitterfornece mais flexibilidade na maneira como você divide a string e permite, por exemplo, pular strings vazias nos resultados e aparar os resultados. Ele também tem um comportamento menos estranho do String.splitque não exige a divisão por regex (essa é apenas uma opção).

ColinD
fonte
6
Teria preferido Splitter.on (","). TrimResults (). Split (string), embora eu veja que você o mencionou. então +1
João B
10
+1 por apontar que Arrays.asList não retorna uma lista normal. Se você tentar adicionar ou remover um elemento da / para essa lista, você receberá uma UnsupportedOperationException.
Alfredo Osorio
9
A goiaba agora tem isso desde (15.0): Splitter.on (","). SplitToList (string) . Salva um pequeno passo.
Kang_V 4/16
Existe alguma maneira de adicionar também valores vazios no String iike se eu tiver o String assim: 1, 3,4,5 aqui 2 está ausente / vazio. Ao converter na lista 2 pulará. Mas eu quero adicionar isso como valor vazio.
A.Aleem11
O problema com esta implementação e alguns outros exemplos semelhantes é que, embora ele Arrays.asListforneça um wrapper em torno da matriz nativa (evitando uma cópia do elemento), ele new ArrayList(...)fará exatamente esse elemento por cópia do elemento. Provavelmente, devemos preferir uma abordagem que permita que os elementos analisados ​​sejam adicionados diretamente à coleção de destino desejada.
YoYo
70

Dois passos:

  1. String [] items = commaSeparated.split("\\s*,\\s*");
  2. List<String> container = Arrays.asList(items);
duffymo
fonte
1
Depois de incorporar a variável de itens, é basicamente o mesmo que as outras respostas, mas um pouco mais eficiente, na verdade, uma vez que não usa regex. Por outro lado, os espaços ao redor da vírgula eliminam essa opção.
Amrinder Arora
2
@AmrinderArora o argumento para splité interpretado como um RegEx.
Madbreaks
23

Aqui está outro para converter CSV em 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));
}

Imprime você

-> string
-> com
-> vírgula

Arvindvp6
fonte
21

Se a Listé o objetivo final, como o OP afirmou, a resposta já aceita ainda é a mais curta e a melhor. No entanto, desejo fornecer alternativas usando o Java 8 Streams , que lhe trarão mais benefícios se fizer parte de um pipeline para processamento adicional.

Envolvendo o resultado da função .split (uma matriz nativa) em um fluxo e convertendo-o em uma lista.

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

Se for importante que o resultado seja armazenado conforme ArrayListo título do OP, você pode usar um Collectormétodo diferente :

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

Ou usando a API de análise RegEx:

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

Observe que você ainda pode considerar deixar a listvariável digitada como em List<String>vez de ArrayList<String>. A interface genérica para Listainda parece bastante semelhante à ArrayListimplementação.

Sozinhos, esses exemplos de código parecem não adicionar muito (exceto mais digitação), mas se você planeja fazer mais, como a resposta da conversão de uma String para uma lista de longos , a API de streaming é realmente poderosa ao permitir para canalizar suas operações uma após a outra.

Por uma questão de integridade, você sabe.

YoYo
fonte
19
List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(toList());
Manu
fonte
1
Uma das melhores respostas agora. A lista pode ser alterada nesta resposta +1.
Sedrick
trabalha depois de alterado collect(toList())paracollect(Collectors.toList()
Sundararaj Govindasamy
Na verdade collect(toList())está usando a importação estática Collectors.toList()para a brevidade e fluência :)
Manu
15

Não existe um método interno para isso, mas você pode simplesmente usar o método split ().

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

Isso deve funcionar para você.

Jason Wheeler
fonte
10

você pode combinar asList e dividir

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

Este código ajudará,

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

Você pode usar o Guava para dividir a sequência e convertê-la em um ArrayList. Isso funciona com uma string vazia também e retorna uma lista vazia.

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

gera o seguinte:

[item1, item2, item3]
[item1, item2, item3, another item]
Brad Parks
fonte
4

Um exemplo usando Collections.

import java.util.Collections;
 ...
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = new ArrayList<>();
Collections.addAll(items, commaSeparated.split("\\s*,\\s*"));
 ...
Filippo Lauria
fonte
1
Você evitou o intermediário Arrays.asList. Infelizmente ainda temos uma cópia dos elementos do array na coleção. Boa alternativa para lembrar.
YoYo
4

Existem várias maneiras de resolver isso usando fluxos no Java 8, mas na IMO os seguintes liners são simples:

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());
akhil_mittal
fonte
Alguém sabe como posso converter essa String em lista separada por vírgula --String s = "2017-07-12 23: 40: 00.0,153.76,16.140,60.00, 56,00,"; List <String> splittedString = new ArrayList <String> (Arrays.asList (s.split ("\\ s *, \\ s *")));
Ensolarado
1
Esta é uma nova pergunta, não faça isso como um comentário. Sinta-se livre para criar uma nova pergunta.
George Siggouroglou
2

Você pode primeiro dividi-los usando String.split(","), e depois converter a string retornada arraypara uma ArrayListutilizaçãoArrays.asList(array)

Saket
fonte
2

No groovy, você pode usar o método tokenize (Character Token):

list = str.tokenize(',')
sivareddy963
fonte
Este me salvou! Obrigado.
tamerlaha
2

O mesmo resultado que você pode obter usando a classe Splitter.

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

(escrito em kotlin)

anoopbryan2
fonte
1
A documentação diz que esta função é beta e instável.
precisa
1
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));

// enter code here
deepu kumar singh
fonte
1

Eu costumo usar padrão pré-compilado para a lista. E isso também é um pouco mais universal, pois pode considerar colchetes que seguem algumas das expressões 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();
Jan Stanicek
fonte
1

No Kotlin, se a sua lista de cadeias de caracteres como esta e você pode usar para converter cadeias de caracteres em ArrayList, use esta linha de código

var str= "item1, item2, item3, item4"
var itemsList = str.split(", ")
Vijendra patidar
fonte
0
List<String> items = Arrays.asList(s.split("[,\\s]+"));
Nenad Bulatovic
fonte
0

Você pode fazer isso da seguinte maneira.

Isso remove o espaço em branco e é dividido por vírgula, onde você não precisa se preocupar com espaços em branco.

    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);
Dulith De Costa
fonte
-1

String -> Conversão de coleção : (String -> String [] -> Collection)

//         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()));

Conversão Collection -> String [] :

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

Conversão String -> String [] :

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

E coleção -> coleção :

List<String> list = new LinkedList<>(col);
Farzan Skt
fonte
-2

converter coleção em string como vírgula separada em Java 8

O objeto listOfString contém elementos ["A", "B", "C", "D"] -

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

A saída é: - 'A', 'B', 'C', 'D'

E converter matriz de seqüências de caracteres em lista no Java 8

    String string[] ={"A","B","C","D"};
    List<String> listOfString = Stream.of(string).collect(Collectors.toList());
Ajay Kumar
fonte
-4
ArrayList<HashMap<String, String>> mListmain = new ArrayList<HashMap<String, String>>(); 
String marray[]= mListmain.split(",");
jonsi
fonte
5
E onde exatamente é o ArrayList? Você leu a pergunta?
Debosmit Ray 31/03/16
@mapeters: Houve um ArrayList. Voltei as edições para a primeira revisão (para que você possa vê-la) e aprimorei a formatação da primeira revisão.
dur
A questão é como converter string em ArrayList, não como converter ArrayList em Array.
camarada