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

538

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

String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = //method that converts above string into list??
Jame
la source
Si vous souhaitez analyser CSV, voir stackoverflow.com/questions/3908012/parsing-csv-in-java
Raedwald
@Raedwald Ce n'est pas ce que OP a demandé
Crowie
3
SEULEMENT la réponse de ColinD est correcte ici, en supposant que vous vouliez une ArrayList comme dans le titre de la question. ArrayList (qui est mutable) est totalement différent de List, qui peut être juste une simple liste fixe.
Fattie
@Fattie - juste point, et corrigé cela - stackoverflow.com/a/34735419/744133
YoYo
1
Solution Java 8: stackoverflow.com/a/46485179/1216775
akhil_mittal

Réponses:

1016

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 sur un délimiteur défini comme: zero or more whitespace, a literal comma, zero or more whitespacequi placera les mots dans la liste et réduira tout espace entre les mots et les virgules.


Veuillez noter que cela renvoie simplement un wrapper sur un tableau: vous NE POUVEZ PAS par exemple à .remove()partir du résultat List. Pour un réel, ArrayListvous devez continuer à utiliser new ArrayList<String>.

AlexR
la source
39
@rosch C'est une expression régulière (regex). \scorrespond à n'importe quel espace blanc, le *applique la correspondance zéro fois ou plus. Signifie donc \s*"correspondre à n'importe quel espace blanc zéro ou plusieurs fois". Nous recherchons cela avant et après la virgule. Par conséquent, le fractionnement fonctionnera pour les chaînes comme "item1 , item2 , item3", ou "item1,item2 ,item3", etc. En Java, vous devez échapper à la barre oblique inverse dans les chaînes, donc vous obtenez\\s*
andrewrjones
9
Je suggère d'utiliser "[\\s,]+"pour couper les espaces blancs pour les valeurs. Par exemple, " item1 , item2 , item3 , "devient ["item1", "item2", "item3"].
Andrii Nemchenko
5
"[\\s,]+"se divisera également sur l'espace interne au sein d'un jeton séparé par des virgules, il traitera les deux espaces comme un délimiteur même lorsqu'aucune virgule n'est présente, au lieu d'une virgule plus n'importe quel nombre d'espaces environnants. "\\s*(,\\s*)+"supprimera les espaces uniquement autour des jetons séparés par des virgules et ignorera également les chaînes qui ne sont que des espaces ou vides.
theferrit32
2
En remarque: si vous vous attendez à obtenir une liste vide dans le cas d'une chaîne d'entrée vide, cette méthode ne convient pas à votre cas d'utilisation. Vous obtiendrez une liste avec 1 élément contenant une chaîne vide.
Madis Pukkonen
3
@AlexR Bien que j'apprécie que vous respectiez le PO, mais je m'abstiendrai de dire de telles choses. Je connais des gens qui se sentent mal de ne pas répondre aux attentes des gens lorsqu'ils sont faussement félicités. Juste une pensée.
199

Arrays.asListrenvoie une taille fixe Listsoutenue par le tableau. Si vous voulez un mutable normal, java.util.ArrayListvous devez le faire:

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

Ou, en utilisant la goyave :

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

L'utilisation de a Splittervous donne plus de flexibilité dans la façon dont vous fractionnez la chaîne et vous permet, par exemple, d'ignorer les chaînes vides dans les résultats et de couper les résultats. Il a également un comportement moins étrange que String.splitde ne pas vous obliger à diviser par regex (ce n'est qu'une option).

ColinD
la source
6
Aurait préféré Splitter.on (","). TrimResults (). Split (string) bien que je vois que vous l'avez mentionné. donc +1
John B
10
+1 pour avoir signalé qu'Arrays.asList ne renvoie pas de liste normale. Si vous essayez d'ajouter ou de supprimer un élément à / de cette liste, vous obtiendrez une exception UnsupportedOperationException.
Alfredo Osorio
9
La goyave a maintenant ceci depuis (15.0): Splitter.on (","). SplitToList (string) . Enregistre un petit pas.
Kango_V
Existe-t-il un moyen d'ajouter également des valeurs vides dans String iike si j'ai String comme ceci: 1,, 3,4,5 ici 2 est manquant / vide. Lors de la conversion dans la liste 2 sautera. Mais je veux ajouter ceci comme valeur vide.
A.Aleem11
Le problème avec cette implémentation, et quelques autres exemples similaires, est que même si le Arrays.asListfournit un wrapper autour du tableau natif (en évitant une copie d'élément), le new ArrayList(...)fera exactement une telle copie élément par élément. Nous devrions probablement préférer une approche qui permet aux éléments analysés d'être directement ajoutés à la collection cible souhaitée.
YoYo
70

Deux étapes:

  1. String [] items = commaSeparated.split("\\s*,\\s*");
  2. List<String> container = Arrays.asList(items);
duffymo
la source
1
Une fois que vous avez inséré la variable items, elle est fondamentalement la même que les autres réponses, mais en fait un peu plus efficace car elle n'utilise pas l'expression régulière. D'un autre côté, les espaces autour de la virgule tueront cette option.
Amrinder Arora
2
@AmrinderArora l'argument à splitest interprété comme un RegEx.
Madbreaks
23

En voici un autre pour convertir 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

Arvindvp6
la source
21

Si a Listest l'objectif final comme l'OP l'a indiqué, alors la réponse déjà acceptée est toujours la plus courte et la meilleure. Cependant, je veux fournir des alternatives utilisant Java 8 Streams , qui vous donneront plus 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 liste.

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

S'il est important que le résultat soit stocké en tant ArrayListque selon le titre de l'OP, vous pouvez utiliser une Collectorméthode différente :

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

Ou en utilisant l'API d'analyse de 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 listvariable tapée comme List<String>au lieu de ArrayList<String>. L'interface générique de Listsemble toujours assez similaire à laArrayList implémentation.

En eux-mêmes, ces exemples de code ne semblent pas en ajouter beaucoup (sauf plus de frappe), mais si vous prévoyez d'en faire plus, comme cette réponse sur la conversion d'une chaîne en une liste de Longs montre , l'API de streaming est vraiment puissante en permettant pour canaliser vos opérations les unes après les autres.

Pour le bien, vous savez, l'exhaustivité.

Yo-yo
la source
19
List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(toList());
Manu
la source
1
Une des meilleures réponses maintenant. La liste peut être modifiée dans cette réponse +1.
Sedrick
fonctionne après avoir changé collect(toList())pourcollect(Collectors.toList()
Sundararaj Govindasamy
En fait, collect(toList())utilise l'importation statique de Collectors.toList()pour plus de brièveté et de fluidité :)
Manu
15

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

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

Cela devrait fonctionner pour vous.

Jason Wheeler
la source
10

vous pouvez combiner asList et diviser

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

Ce code vous aidera,

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

Vous pouvez utiliser Guava pour diviser la chaîne et la convertir en ArrayList. 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);

génère les éléments suivants:

[item1, item2, item3]
[item1, item2, item3, another item]
Brad Parks
la source
4

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*"));
 ...
Filippo Lauria
la source
1
Vous avez évité l'intermédiaire Arrays.asList. Malheureusement, nous avons toujours une copie des éléments du tableau dans la collection. Belle alternative à retenir.
YoYo
4

Il existe de nombreuses façons de résoudre ce problème en utilisant des flux dans Java 8, mais les lignes suivantes de l'OMI 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());
akhil_mittal
la source
Quelqu'un sait-il comment convertir cette chaîne en liste séparée par des virgules --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 *")));
Sunny
1
Ceci est une nouvelle question, ne la posez pas en commentaire. N'hésitez pas à créer une nouvelle question.
George Siggouroglou
2

Vous pouvez tout d' abord les séparer à l' aide String.split(","), puis convertir la chaîne de retour arrayà une ArrayListaide deArrays.asList(array)

Saket
la source
2

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

list = str.tokenize(',')
sivareddy963
la source
Celui-ci m'a sauvé! Je vous remercie.
tamerlaha
2

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

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

(écrit en kotlin)

anoopbryan2
la source
1
La documentation indique que cette fonction est bêta et instable.
Rubberducker
1
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));

// enter code here
deepu kumar singh
la source
1

J'utilise généralement un modèle précompilé pour la liste. Et cela est également légèrement plus universel car il peut considérer les 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();
Jan Stanicek
la source
1

Dans Kotlin, si votre liste de chaînes comme celle-ci et que vous pouvez utiliser pour convertir une chaîne en ArrayList, utilisez cette ligne de code

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

Vous pouvez le faire comme suit.

Cela supprime les espaces blancs et les divise par des virgules où vous n'avez pas à vous soucier 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);
Dulith De Costa
la source
-1

Chaîne -> Conversion de collection : (Chaîne -> Chaîne [] -> 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()));

Collection -> Conversion chaîne [] :

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

Chaîne -> Conversion chaîne [] :

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

Et Collection -> Collection :

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

convertir la collection en chaîne comme une virgule séparée dans Java 8

L'objet listOfString contient les éléments ["A", "B", "C", "D"]

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

La sortie est: - 'A', 'B', 'C', 'D'

Et convertir un tableau de chaînes en liste dans Java 8

    String string[] ={"A","B","C","D"};
    List<String> listOfString = Stream.of(string).collect(Collectors.toList());
Ajay Kumar
la source
-4
ArrayList<HashMap<String, String>> mListmain = new ArrayList<HashMap<String, String>>(); 
String marray[]= mListmain.split(",");
jonsi
la source
5
Et où est exactement le ArrayList? Avez-vous même lu la question?
Debosmit Ray
@mapeters: Il y avait un ArrayList. J'ai annulé les modifications de la première révision (afin que vous puissiez le voir) et amélioré la mise en forme de la première révision.
dur
La question est de savoir comment convertir une chaîne en ArrayList, pas comment convertir ArrayList en Array.
camarade