Comment diviser une chaîne séparée par des virgules?

202

J'ai une chaîne de longueur inconnue qui ressemble à ceci

"dog, cat, bear, elephant, ..., giraffe"

Quelle serait la meilleure façon de diviser cette chaîne au niveau des virgules afin que chaque mot puisse devenir un élément d'une ArrayList?

Par exemple

List<String> strings = new ArrayList<Strings>();
// Add the data here so strings.get(0) would be equal to "dog",
// strings.get(1) would be equal to "cat" and so forth.
James Fazio
la source
1
utilisez la méthode split ("spliting char") elle divise votre chaîne nad la méthode créera un tableau de chaînes avec des mots fractionnés.
Simon Dorociak

Réponses:

343

Vous pouvez faire ceci:

String str = "...";
List<String> elephantList = Arrays.asList(str.split(","));

Fondamentalement, la .split()méthode divisera la chaîne en fonction (dans ce cas) du délimiteur que vous passez et renverra un tableau de chaînes.

Cependant, vous semblez rechercher une liste de chaînes plutôt qu'un tableau, donc le tableau doit être transformé en liste à l'aide de l' Arrays.asList()utilitaire. Tout comme un info, vous pouvez également faire quelque chose comme ça:

String str = "...";
ArrayList<String> elephantList = new ArrayList<>(Arrays.asList(str.split(","));

Mais il est généralement préférable de programmer sur une interface plutôt que sur une implémentation concrète réelle, donc je recommanderais la 1ère option.

npinti
la source
9
Gardez à l'esprit que cela ne réduira pas les valeurs, donc strings.get (1) sera "cat" et non "cat"
Alb
45
str.splitaccepte l'expression régulière afin que vous puissiez l'utiliser str.split(",[ ]*");pour supprimer les virgules et les espaces après les virgules.
vertti
4
Un fichier délimité par des virgules (csv) peut avoir une virgule entre guillemets, ce qui signifie qu'il ne s'agit pas d'un délimiteur. Dans ce cas, Split ne fonctionnera pas.
Steven Trigg
2
La deuxième option nécessite une conversion en ArrayList<String>.
C_B
3
Si vous devez conserver des entrées vides (par exemple pour une longueur de tableau cohérente), utilisez split (",", - 1) selon stackoverflow.com/questions/14602062/…
Fast Engy
157

Eh bien, vous voulez vous séparer , non?

String animals = "dog, cat, bear, elephant, giraffe";

String[] animalsArray = animals.split(",");

Si vous souhaitez également vous débarrasser des espaces autour des éléments:

String[] animalsArray = animals.split("\\s*,\\s*");
Tomasz Nurkiewicz
la source
Oui, cela fait partie de la solution. L'OP semble être après une liste de chaînes, pas un tableau.
npinti
@npinti: oui, +1 pour vous, vous étiez plus rapide et je ne voulais pas copier votre Arrays.asList()idiome.
Tomasz Nurkiewicz
1
J'ai continué à réfléchir pendant 10 heures, puis j'ai cherché SO. ne savait pas qu'il était si facile de .split ();
DeathRs
Que faire si vous souhaitez stocker les éléments fractionnés résultants dans un ensemble plutôt que dans un tableau?
Moses Kirathe
29

Vous pouvez le diviser et créer un tableau puis accéder comme un tableau

String names = "prappo,prince";
String[] namesList = names.split(",");

vous pouvez accéder comme

String name1 = namesList [0];
String name2 = namesList [1];

ou en utilisant une boucle

for(String name : namesList){
System.out.println(name);
}

j'espère que cela vous aidera.

Prappo Islam Prince
la source
18

Une petite amélioration: les solutions ci-dessus ne supprimeront pas les espaces de début ou de fin dans la chaîne réelle. Il vaut mieux appeler trim avant d'appeler split. Au lieu de cela,

 String[] animalsArray = animals.split("\\s*,\\s*");

utilisation

 String[] animalsArray = animals.trim().split("\\s*,\\s*");
user872858
la source
1
pour votre deuxième ligne, si nous utilisons trim (), nous n'avons pas besoin de fractionner l'espace comme il ("\\s*,\\s*")suffit d'utiliser (",");cela donnera les mêmes résultats.
WIZARD
5
Je ne suis pas sûr de cela @WIZARD car trim supprime uniquement les espaces gauche et droit de la chaîne, mais pas l'espace qu'il contient. Il en trim(" string, with , space ")sera ainsi "string, with , space".
Thomas Leduc
@ThomasLeduc si la chaîne est comme ça, "dog, cat, bear, elephant, giraffe"alors pas besoin de trim()et dans le cas où si l'utilisation trim()alors sortie ne sera "string,with,space"pas celle-ci"string, with , space"
WIZARD
trim()supprimera tous les espaces, pas seulement les espaces gauche et droit de la chaîne
WIZARD
5
Le testez-vous? car je viens d'écrire un programme java et la chaîne de " string, with , space ".trim()retour "string, with , space". Comme le dit javadoc: renvoie une copie de la chaîne, avec les espaces de début et de fin omis. Vous vous trompez et @ user872858 a raison.
Thomas Leduc
3

Vous pouvez d'abord diviser des noms comme celui-ci

String animals = "dog, cat, bear, elephant,giraffe";

String animals_list[] = animals.split(",");

accéder à vos animaux

String animal1 = animals_list[0];
String animal2 = animals_list[1];
String animal3 = animals_list[2];
String animal4 = animals_list[3];

Et vous souhaitez également supprimer les espaces blancs et les virgules autour des noms d'animaux

String animals_list[] = animals.split("\\s*,\\s*");
hacher
la source
3

Pour être complet, en utilisant la bibliothèque Guava , vous feriez: Splitter.on(",").split(“dog,cat,fox”)

Un autre exemple:

String animals = "dog,cat, bear,elephant , giraffe ,  zebra  ,walrus";
List<String> l = Lists.newArrayList(Splitter.on(",").trimResults().split(animals));
// -> [dog, cat, bear, elephant, giraffe, zebra, walrus]

Splitter.split()renvoie un Iterable, donc si vous avez besoin d'une liste, enveloppez-la Lists.newArrayList()comme ci-dessus. Sinon, allez simplement avec l'itérable, par exemple:

for (String animal : Splitter.on(",").trimResults().split(animals)) {
    // ...
}

Notez comment trimResults()gère tous vos besoins de découpe sans avoir à modifier les regex pour les caisses d'angle , comme avec String.split().

Si votre projet utilise déjà la goyave, cela devrait être votre solution préférée. Voir la documentation Splitter dans le Guide de l'utilisateur de Guava ou les javadocs pour plus d'options de configuration.

Jonik
la source
2

Peut essayer avec cela a fonctionné pour moi

 sg = sg.replaceAll(", $", "");

ou sinon

if (sg.endsWith(",")) {
                    sg = sg.substring(0, sg.length() - 1);
                }
Tarit Ray
la source
1

dans build.gradle ajouter Guava

    compile group: 'com.google.guava', name: 'guava', version: '27.0-jre'

puis

    public static List<String> splitByComma(String str) {
    Iterable<String> split = Splitter.on(",")
            .omitEmptyStrings()
            .trimResults()
            .split(str);
    return Lists.newArrayList(split);
    }

    public static String joinWithComma(Set<String> words) {
        return Joiner.on(", ").skipNulls().join(words);
    }

prendre plaisir :)

panayot_kulchev_bg
la source
0

Supprimez tous les espaces blancs et créez une liste de taille fixe ou immuable (voir la asList documentation de l'API )

final String str = "dog, cat, bear, elephant, ..., giraffe";
List<String> list = Arrays.asList(str.replaceAll("\\s", "").split(","));
// result: [dog, cat, bear, elephant, ..., giraffe]

Il est possible d'utiliser également replaceAll(\\s+", "")mais l'efficacité maximale dépend du cas d'utilisation. (voir la réponse de @GurselKoca à Supprimer les espaces blancs des chaînes en Java )

sdc
la source
0

Vous pouvez utiliser quelque chose comme ceci:

String animals = "dog, cat, bear, elephant, giraffe";

List<String> animalList = Arrays.asList(animals.split(","));

En outre, vous incluriez les bibliothèques:

import java.util.ArrayList;
import java.util.Arrays; 
import java.util.List;
Diego Cortes
la source
0

Utilisez ceci :

        List<String> splitString = (List<String>) Arrays.asList(jobtype.split(","));
Abhishek Sengupta
la source
0

À Kotlin,

val stringArray = commasString.replace(", ", ",").split(",")

stringArrayest List<String>et commasStringest Stringavec des virgules et des espaces

Kishan Solanki
la source
0

Ceci est un moyen facile de diviser la chaîne par une virgule,

import java.util.*;

public class SeparatedByComma{
public static void main(String []args){
     String listOfStates = "Hasalak, Mahiyanganaya, Dambarawa, Colombo";
     List<String> stateList = Arrays.asList(listOfStates.split("\\,"));
     System.out.println(stateList);
 }
}
Sandun Susantha
la source
Ce code que j'ai utilisé pour JDK. Et si vous devez imprimer le tableau. use System.out.println
Sandun Susantha
-1

Il existe une fonction appelée replaceAll()qui peut supprimer tous les espaces blancs en les remplaçant par ce que vous voulez. Par exemple

String str="  15. 9 4;16.0 1"
String firstAndSecond[]=str.replaceAll("\\s","").split(";");
System.out.println("First:"+firstAndSecond[0]+", Second:"+firstAndSecond[1]);

te donnera:

First:15.94, Second:16.01
Mawhrin-Skel
la source