¿Cómo convertir cadenas separadas por comas a ArrayList?

538

¿Hay algún método incorporado en Java que nos permita convertir cadenas separadas por comas en algún contenedor (por ejemplo, matriz, lista o vector)? ¿O necesito escribir un código personalizado para eso?

String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = //method that converts above string into list??
Jame
fuente
Si desea analizar CSV, consulte stackoverflow.com/questions/3908012/parsing-csv-in-java
Raedwald el
@Raedwald Eso no es lo que OP pidió sin embargo
Crowie
3
SOLO la respuesta de ColinD es correcta aquí, suponiendo que desea una ArrayList como en el título de la pregunta. ArrayList (que es mutable) es totalmente diferente de List, que puede ser solo una lista fija simple.
Fattie
@Fattie - punto justo, y que fija - stackoverflow.com/a/34735419/744133
Yoyo
1
Solución Java 8: stackoverflow.com/a/46485179/1216775
akhil_mittal

Respuestas:

1016

Convertir cadena separada por comas en lista

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

El código anterior divide la cadena en un delimitador definido como: zero or more whitespace, a literal comma, zero or more whitespaceque colocará las palabras en la lista y colapsará cualquier espacio en blanco entre las palabras y las comas.


Tenga en cuenta que esto devuelve simplemente un contenedor en una matriz: NO PUEDE, por ejemplo, a .remove()partir del resultado List. Para un real ArrayListdebe usar más new ArrayList<String>.

AlexR
fuente
39
@rosch Es una expresión regular (regex). \scoincide con cualquier espacio en blanco, *aplica la coincidencia cero o más veces. Entonces \s*significa "hacer coincidir cualquier espacio en blanco cero o más veces". Buscamos esto antes y después de la coma. Por lo tanto, la división funcionará para cadenas como "item1 , item2 , item3", o "item1,item2 ,item3", etc. En Java, debe escapar de la barra diagonal inversa en cadenas, por lo que obtiene\\s*
andrewrjones
99
Sugiero usar "[\\s,]+"para recortar espacios en blanco para los valores. Por ejemplo, se " item1 , item2 , item3 , "convierte ["item1", "item2", "item3"].
Andrii Nemchenko
55
"[\\s,]+"también se dividirá en el espacio interno dentro de un token separado por comas, tratará ambos espacios en blanco como un delimitador incluso cuando no haya una coma, en lugar de una coma más cualquier número de espacios en blanco circundantes. "\\s*(,\\s*)+"recortará el espacio en blanco solo alrededor de los tokens separados por comas, y también ignorará cualquier cadena que sea solo un espacio en blanco o vacío.
theferrit32
2
Como nota al margen: si espera obtener una lista vacía en el caso de una cadena de entrada vacía, entonces este método no es adecuado para su caso de uso. Obtendrá una lista con 1 elemento que contiene una cadena vacía.
Madis Pukkonen
3
@AlexR Aunque agradezco que respete el OP, pero me abstendría de decir esas cosas. Sé de personas que se sienten mal por no cumplir con las expectativas de las personas cuando se les elogia falsamente. Solo un pensamiento.
199

Arrays.asListdevuelve un tamaño fijo Listrespaldado por la matriz. Si desea una mutable normal java.util.ArrayList, debe hacer esto:

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

O, usando guayaba :

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

El uso de Splitterle brinda más flexibilidad en la forma de dividir la cadena y le permite, por ejemplo, omitir cadenas vacías en los resultados y recortar resultados. También tiene un comportamiento menos extraño que String.split, además de no requerir que se divida por expresiones regulares (esa es solo una opción).

ColinD
fuente
66
Hubiera preferido Splitter.on (","). TrimResults (). Split (string) aunque veo que lo mencionaste. entonces +1
John B
10
+1 por señalar que Arrays.asList no devuelve una lista normal. Si intenta agregar o eliminar un elemento a / de esa Lista, obtendrá una UnsupportedOperationException.
Alfredo Osorio
99
La guayaba ahora tiene esto desde (15.0): Splitter.on (","). SplitToList (string) . Guarda un pequeño paso.
Kango_V
¿Hay alguna manera de agregar también valores vacíos en String iike si tengo String como este: 1,, 3,4,5 aquí 2 falta / está vacío. Al convertir en la lista 2 se saltará. Pero quiero agregar esto como valor vacío.
A.Aleem11
El problema con esta implementación, y algunos otros ejemplos similares, es que aunque Arrays.asListproporciona un contenedor alrededor de la matriz nativa (evitando una copia del elemento), new ArrayList(...)hará exactamente ese elemento por copia del elemento. Probablemente deberíamos preferir un enfoque que permita agregar elementos analizados directamente a la colección de destino deseada.
YoYo
70

Dos pasos:

  1. String [] items = commaSeparated.split("\\s*,\\s*");
  2. List<String> container = Arrays.asList(items);
duffymo
fuente
1
Una vez que inserta la variable de elementos, es básicamente lo mismo que otras respuestas, pero en realidad es un poco más eficiente ya que no usa expresiones regulares. Por otro lado, los espacios alrededor de la coma eliminarán esta opción.
Amrinder Arora
2
@AmrinderArora el argumento splitse interpreta como un RegEx.
Madbreaks
23

Aquí hay otro para convertir CSV a 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));
}

Te imprime

-> cadena
-> con
-> coma

Arvindvp6
fuente
21

Si a Listes el objetivo final como lo indicó el OP, entonces la respuesta ya aceptada sigue siendo la más corta y la mejor. Sin embargo, quiero proporcionar alternativas utilizando Java 8 Streams , que le darán más beneficios si es parte de una tubería para su posterior procesamiento.

Al ajustar el resultado de la función .split (una matriz nativa) en una secuencia y luego convertirla en una lista.

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

Si es importante que el resultado se almacene según ArrayListel título del OP, puede usar un Collectormétodo diferente :

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

O mediante el uso de la API de análisis RegEx:

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

Tenga en cuenta que aún podría considerar dejar la listvariable escrita como en List<String>lugar de ArrayList<String>. La interfaz genérica para Listtodavía parece bastante similar a la ArrayListimplementación.

Por sí mismos, estos ejemplos de código no parecen agregar mucho (excepto más tipeo), pero si planea hacer más, como esta respuesta en la conversión de una Cadena a una Lista de Longs , la API de transmisión es realmente poderosa al permitir para canalizar sus operaciones una tras otra.

Por el bien, ya sabes, la integridad.

Yoyó
fuente
19
List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(toList());
Manu
fuente
1
Una de las mejores respuestas ahora. La lista puede modificarse en esta respuesta +1.
Sedrick
funciona después de cambiado collect(toList())acollect(Collectors.toList()
Sundararaj Govindasamy
De hecho, collect(toList())está utilizando la importación estática de Collectors.toList()para brevedad y fluidez :)
Manu
15

No hay un método incorporado para esto, pero simplemente puede usar el método split () en esto.

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

Eso debería funcionar para ti.

Jason Wheeler
fuente
10

puedes combinar asList y split

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

Este código te ayudará,

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

Puede usar Guava para dividir la cadena y convertirla en una ArrayList. Esto también funciona con una cadena vacía y devuelve una lista vacía.

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

produce lo siguiente:

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

Un ejemplo 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
fuente
1
Evitaste el intermediario Arrays.asList. Desafortunadamente, todavía tenemos una copia de los elementos de la matriz en la colección. Buena alternativa para recordar.
YoYo
4

Hay muchas maneras de resolver esto usando secuencias en Java 8, pero en mi opinión, los siguientes revestimientos son sencillos:

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
fuente
¿Alguien sabe cómo puedo convertir esta cadena en una lista separada por comas --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 *")));
Soleado
1
Esta es una nueva pregunta, no la haga como comentario. Siéntase libre de crear una nueva pregunta.
George Siggouroglou
2

Primero puede dividirlos usando String.split(","), y luego convertir la cadena devuelta arraya un ArrayListusoArrays.asList(array)

Saket
fuente
2

En groovy, puedes usar el método tokenize (Token de personaje):

list = str.tokenize(',')
sivareddy963
fuente
Este me salvó! Gracias.
tamerlaha
2

El mismo resultado que puede lograr con la clase Splitter.

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

(escrito en kotlin)

anoopbryan2
fuente
1
La documentación dice que esta función es beta e inestable.
Rubberducker
1
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));

// enter code here
deepu kumar singh
fuente
1

Usualmente uso un patrón precompilado para la lista. Y también esto es un poco más universal ya que puede considerar paréntesis que siguen algunas de las expresiones 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
fuente
1

En Kotlin, si su lista de cadenas como esta y puede usar para convertir cadenas a ArrayList, use esta línea de código

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

Puedes hacerlo de la siguiente manera.

Esto elimina el espacio en blanco y se divide por comas donde no necesita preocuparse por los espacios en blanco.

    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
fuente
-1

Cadena -> Conversión de colección : (Cadena -> Cadena [] -> Colección)

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

Colección -> Cadena [] conversión:

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

Cadena -> Cadena de conversión [] :

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

Y Colección -> Colección :

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

Convierta la colección en cadena como se separó por comas en Java 8

El objeto listOfString contiene elementos ["A", "B", "C", "D"]

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

La salida es: - 'A', 'B', 'C', 'D'

Y convertir matriz de cadenas a lista en Java 8

    String string[] ={"A","B","C","D"};
    List<String> listOfString = Stream.of(string).collect(Collectors.toList());
Ajay Kumar
fuente
-4
ArrayList<HashMap<String, String>> mListmain = new ArrayList<HashMap<String, String>>(); 
String marray[]= mListmain.split(",");
jonsi
fuente
55
¿Y dónde está exactamente el ArrayList? ¿Leíste la pregunta?
Debosmit Ray
@mapeters: Hubo un ArrayList. Retrocedí las ediciones a la primera revisión (para que pueda verlo) y mejoré el formato de la primera revisión.
durante
La pregunta es cómo convertir una cadena a ArrayList, no cómo convertir ArrayList a Array.
camarada