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??
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>
.
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).
Deux étapes:
String [] items = commaSeparated.split("\\s*,\\s*");
List<String> container = Arrays.asList(items);
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
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.
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(",")));
List<String> items = Arrays.asList(commaSeparated.split(","));
Cela devrait fonctionner pour vous.
List<String> items= Stream.of(commaSeparated.split(","))
.map(String::trim)
.collect(toList());
vous pouvez combiner asList et split
Arrays.asList(CommaSeparated.split("\\s*,\\s*"))
Ce code aidera,
String myStr = "item1,item2,item3";
List myList = Arrays.asList(myStr.split(","));
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]
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*"));
...
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)
.
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());
En groovy, vous pouvez utiliser la méthode tokenize (Character Token):
list = str.tokenize(',')
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();
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));
// enter code here
List<String> items = Arrays.asList(s.split("[,\\s]+"));
Même résultat que vous pouvez obtenir avec la classe Splitter.
var list = Splitter.on(",").splitToList(YourStringVariable)
(écrit en kotlin)
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);