web-dev-qa-db-fra.com

Comment convertir une chaîne séparée par des virgules en ArrayList?

Existe-t-il une méthode intégrée en Java permettant de convertir une chaîne séparée par des virgules en un conteneur (tableau, liste ou vecteur, par exemple)? Ou dois-je écrire un code personnalisé pour cela? 

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

Convertir une chaîne séparée par des virgules en liste

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

Le code ci-dessus divise la chaîne en un délimiteur défini comme suit: zero or more whitespace, a literal comma, zero or more whitespace qui placera les mots dans la liste et réduira tout espace entre les mots et les virgules.


Notez que ceci renvoie simplement un wrapper sur un tableau: vousNE POUVEZ PASpar exemple .remove() à partir de la List résultante. Pour une ArrayList réelle, vous devez en outre utiliser new ArrayList<String>.

894
AlexR

Arrays.asList renvoie une List de taille fixe, sauvegardée par le tableau. Si vous voulez un Java.util.ArrayList mutable normal, vous devez le faire:

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

Ou, en utilisant Goyave :

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

L'utilisation de Splitter vous donne plus de flexibilité dans la manière de scinder la chaîne et vous permet, par exemple, d'ignorer les chaînes vides dans les résultats et les résultats de coupe. Il a également un comportement moins étrange que String.split et ne vous oblige pas à vous séparer par regex (ce n’est qu’une option).

169
ColinD

Deux étapes:

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

Voici un autre exemple de conversion de CSV en 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));
}

Vous imprime

-> chaîne
-> avec
-> virgule

22
Arvindvp6

Si un List est l'objectif final comme indiqué par le PO, la réponse déjà acceptée est toujours la plus courte et la meilleure. Toutefois, je souhaite proposer des alternatives utilisant Java 8 Streams , qui vous apporteront davantage d’avantages si elles font partie d’un pipeline pour un traitement ultérieur.

En encapsulant le résultat de la fonction .split (un tableau natif) dans un flux, puis en le convertissant en une liste.

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

S'il est important que le résultat soit stocké sous la forme d'une ArrayList conformément au titre de l'OP, vous pouvez utiliser une autre méthode Collector:

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

Ou en utilisant l’API d’analyse RegEx:

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

Notez que vous pouvez toujours envisager de laisser la variable list saisie en tant que List<String> au lieu de ArrayList<String>. L’interface générique pour List est toujours assez similaire à l’implémentation ArrayList.

En eux-mêmes, ces exemples de code ne semblent pas ajouter grand chose (sauf plus de dactylographie), mais si vous envisagez de faire plus, comme cette réponse sur la conversion d'une chaîne en liste de longs exemplifies, l'API de streaming très puissant en permettant de canaliser vos opérations les unes après les autres. 

Par souci de, vous savez, la complétude.

17
YoYo

Il n'y a pas de méthode intégrée pour cela, mais vous pouvez simplement utiliser la méthode split () dans ceci.

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

Cela devrait fonctionner pour vous.

13
Jason Wheeler
List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(toList());
12
Manu

vous pouvez combiner asList et split

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

Ce code aidera,

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

Vous pouvez utiliser Guava pour scinder la chaîne et la convertir en liste de tableaux. Cela fonctionne également avec une chaîne vide et renvoie une liste vide. 

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

affiche les éléments suivants:

[item1, item2, item3]
[item1, item2, item3, another item]
5
Brad Parks

Un exemple utilisant Collections.

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

Vous pouvez d’abord les séparer avec String.split(","), puis convertir la chaîne array renvoyée en une ArrayList utilisant Arrays.asList(array).

2
Saket

Il existe de nombreuses façons de résoudre ce problème en utilisant des flux dans Java 8 , mais les doublures suivantes sont 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());
2
i_am_zero

En groovy, vous pouvez utiliser la méthode tokenize (Character Token):

list = str.tokenize(',')
1
sivareddy963

J'utilise généralement un modèle précompilé pour la liste. Et aussi, ceci est légèrement plus universel puisqu'il peut considérer des crochets qui suivent certaines des expressions 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
Jan Stanicek
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));

// enter code here
1
deepu kumar singh
List<String> items = Arrays.asList(s.split("[,\\s]+"));
0
Nenad Bulatovic

Même résultat que vous pouvez obtenir avec la classe Splitter.

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

(écrit en kotlin)

0
anoopbryan2

Vous pouvez le faire comme suit.

Cela supprime les espaces blancs et les divise par virgule sans avoir à se préoccuper des espaces blancs. 

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