Come convertire una stringa separata da virgola in ArrayList?


538

Esiste un metodo integrato in Java che ci consente di convertire String separate da virgole in alcuni container (ad esempio array, List o Vector)? O devo scrivere un codice personalizzato per questo?

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


@Raedwald Non è quello che OP ha richiesto però
Crowie,

3
SOLO la risposta di ColinD è corretta qui, supponendo che tu voglia una ArrayList come nel titolo della domanda. ArrayList (che è mutabile) è totalmente diverso da Elenco, che può essere solo un semplice elenco fisso.
Fattie,

@Fattie - punto giusto, e fissa che - stackoverflow.com/a/34735419/744133
YoYo

Risposte:


1016

Converti stringa separata da virgole in elenco

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

Il codice sopra divide la stringa su un delimitatore definito come: zero or more whitespace, a literal comma, zero or more whitespaceche posizionerà le parole nell'elenco e comprimerà qualsiasi spazio bianco tra le parole e le virgole.


Nota che questo restituisce semplicemente un wrapper su un array: NON PUOI, ad esempio, ricavare .remove()dal risultato List. Per un reale ArrayListè necessario utilizzare ulteriormente new ArrayList<String>.


39
@rosch È un'espressione regolare (regex). \scorrisponde a qualsiasi spazio bianco, *applica la corrispondenza zero o più volte. Quindi \s*significa "abbina qualsiasi spazio bianco zero o più volte". Lo cerchiamo prima e dopo la virgola. Pertanto, la divisione funzionerà per stringhe come "item1 , item2 , item3", o "item1,item2 ,item3", ecc. In Java, è necessario sfuggire alla barra rovesciata nelle stringhe, in modo da ottenere\\s*
andrewrjones,

9
Suggerisco di usare "[\\s,]+"per tagliare gli spazi bianchi per i valori. Ad esempio, " item1 , item2 , item3 , "diventa ["item1", "item2", "item3"].
Andrii Nemchenko,

5
"[\\s,]+"si dividerà anche sullo spazio interno all'interno di un token separato da virgola, tratterà entrambi gli spazi bianchi come delimitatore anche quando non è presente una virgola, anziché una virgola più un numero qualsiasi di spazi bianchi circostanti. "\\s*(,\\s*)+"taglierà gli spazi bianchi solo attorno ai token separati da virgola e ignorerà anche le stringhe che sono solo spazi bianchi o vuoti.
theferrit32

2
Come nota a margine: se ti aspetti di ottenere un elenco vuoto in caso di una stringa di input vuota, questo metodo non è adatto al tuo caso d'uso. Otterrai un elenco con 1 elemento contenente una stringa vuota.
Madis Pukkonen,

3
@AlexR Anche se apprezzo che tu rispetti il ​​PO, ma mi trattengo dal dire queste cose. Conosco persone che si sentono male per non aver soddisfatto le aspettative delle persone quando vengono elogiate in modo falso. Solo un pensiero.

199

Arrays.asListrestituisce una dimensione fissa Listsupportata dall'array. Se vuoi un normale mutevole java.util.ArrayListdevi fare questo:

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

Oppure, usando Guava :

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

L'uso di a Splitterti dà maggiore flessibilità nel modo in cui dividi la stringa e ti dà la possibilità, ad esempio, di saltare stringhe vuote nei risultati e tagliare i risultati. Ha anche un comportamento meno strano rispetto String.splita non richiedere la divisione per regex (questa è solo un'opzione).


6
Avrei preferito Splitter.on (","). TrimResults (). Split (stringa) anche se vedo che l'hai menzionato. quindi +1
Giovanni B,

10
+1 per indicare che Arrays.asList non restituisce un elenco normale. Se provi ad aggiungere o rimuovere un elemento in / da quell'Elenco otterrai un UnsupportedOperationException.
Alfredo Osorio,

9
Guava ora ha questo da (15.0): Splitter.on (","). SplitToList (stringa) . Salva un piccolo passo.
Kango_V,

C'è un modo per aggiungere anche valori vuoti in String come se ho String in questo modo: 1,, 3,4,5 qui 2 è mancante / vuoto. Durante la conversione nell'elenco 2 salterà. Ma voglio aggiungere questo come valore vuoto.
A.Aleem11

Il problema con questa implementazione, e alcuni altri esempi simili, è che sebbene Arrays.asListfornisca un wrapper attorno alla matrice nativa (evitando una copia dell'elemento), new ArrayList(...)farà esattamente un tale elemento per copia dell'elemento. Probabilmente dovremmo preferire un approccio che consenta di aggiungere direttamente elementi analizzati alla raccolta di destinazione desiderata.
YoYo,

70

Due passaggi:

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

1
Una volta incorporata la variabile items, è sostanzialmente la stessa delle altre risposte, ma in realtà è un po 'più efficiente poiché non usa regex. D'altro canto, gli spazi attorno alla virgola uccideranno questa opzione.
Amrinder Arora,

2
@AmrinderArora l'argomento a splitviene interpretato come RegEx.
Madbreaks

23

Eccone un altro per convertire CSV in 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));
}

Ti stampa

-> stringa
-> con
-> virgola


21

Se a Listè l'obiettivo finale come dichiarato dall'OP, la risposta già accettata è ancora la più breve e la migliore. Tuttavia, desidero fornire alternative utilizzando Java 8 Streams , che ti daranno maggiori vantaggi se fa parte di una pipeline per ulteriori elaborazioni.

Inserendo il risultato della funzione .split (un array nativo) in un flusso e convertendolo in un elenco.

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

Se è importante che il risultato sia memorizzato come da ArrayListtitolo dall'OP, è possibile utilizzare un Collectormetodo diverso :

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

O usando l'API di analisi RegEx:

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

Nota che potresti comunque considerare di lasciare la listvariabile digitata come List<String>anziché ArrayList<String>. L'interfaccia generica per Listsembra ancora abbastanza simile ArrayListall'implementazione.

Di per sé, questi esempi di codice non sembrano aggiungere molto (tranne una maggiore digitazione), ma se hai intenzione di fare di più, come esemplifica questa risposta sulla conversione di una stringa in un elenco di lunghi , l'API di streaming è davvero potente consentendo per organizzare le operazioni una dopo l'altra.

Per completezza, sai.


19
List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(toList());

1
Una delle migliori risposte ora. L'elenco può essere modificato in questa risposta +1.
Sedrick,

funziona dopo essere cambiato collect(toList())incollect(Collectors.toList()
Sundararaj Govindasamy il

In realtà collect(toList())sta usando l'importazione statica di Collectors.toList()per brevità e fluidità :)
Manu,

15

Non esiste un metodo integrato per questo, ma puoi semplicemente usare il metodo split () in questo.

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

14
List<String> items = Arrays.asList(commaSeparated.split(","));

Questo dovrebbe funzionare per te.


10

puoi combinare asList e dividere

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

8

Questo codice aiuterà,

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

5

Puoi usare Guava per dividere la stringa e convertirla in una matrice. Funziona anche con una stringa vuota e restituisce un elenco vuoto.

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

genera quanto segue:

[item1, item2, item3]
[item1, item2, item3, another item]

4

Un esempio usando Collections.

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

1
Hai evitato l'intermediario Arrays.asList. Purtroppo abbiamo ancora una copia dagli elementi dell'array nella raccolta. Bella alternativa da ricordare.
YoYo,

4

Esistono molti modi per risolverlo usando i flussi in Java 8 ma IMO i seguenti liner sono semplici:

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

Qualcuno sa come posso convertire questa stringa in un elenco separato da virgole --String s = "2017-07-12 23: 40: 00.0.153.76,16.140,60,00,, 56,00,"; Elenco <String> splittedString = new ArrayList <String> (Arrays.asList (s.split ("\\ s *, \\ s *")));
Sunny

1
Questa è una nuova domanda, non chiederla come commento. Sentiti libero di creare una nuova domanda.
George Siggouroglou,

2

Puoi prima dividerli usando String.split(","), quindi convertire la stringa restituita arrayin un ArrayListutilizzoArrays.asList(array)


2

In groovy, puoi usare il metodo tokenize (Character Token):

list = str.tokenize(',')

Questo mi ha salvato! Grazie.
Tamerlaha,

2

Stesso risultato che puoi ottenere usando la classe Splitter.

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

(scritto in kotlin)


1
La documentazione dice che questa funzione è beta e instabile.
Rubberducker,

1
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));

// enter code here

1

Di solito uso un modello precompilato per l'elenco. E anche questo è leggermente più universale poiché può considerare parentesi che seguono alcune delle espressioni 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

In Kotlin se il tuo elenco di stringhe è simile a questo e puoi utilizzarlo per convertire la stringa in ArrayList, usa questa riga di codice

var str= "item1, item2, item3, item4"
var itemsList = str.split(", ")


0

Puoi farlo come segue.

Ciò rimuove gli spazi bianchi e li divide per virgola dove non è necessario preoccuparsi degli spazi bianchi.

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

-1

String -> Conversione raccolta : (String -> String [] -> 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()));

Raccolta -> Conversione stringa [] :

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

String -> String [] conversione:

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

E collezione -> Collezione :

List<String> list = new LinkedList<>(col);

-2

converti Collection in stringa come virgola separata in Java 8

L'oggetto listOfString contiene ["A", "B", "C", "D"] elementi-

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

L'output è: - 'A', 'B', 'C', 'D'

E converti array di stringhe in elenco in Java 8

    String string[] ={"A","B","C","D"};
    List<String> listOfString = Stream.of(string).collect(Collectors.toList());

-4
ArrayList<HashMap<String, String>> mListmain = new ArrayList<HashMap<String, String>>(); 
String marray[]= mListmain.split(",");

5
E dov'è esattamente il ArrayList? Hai persino letto la domanda?
Debosmit Ray

@mapeters: c'era un ArrayList. Ho ripristinato le modifiche alla prima revisione (in modo da poterlo vedere) e migliorato la formattazione della prima revisione.
durante

La domanda è come convertire una stringa in ArrayList, non come convertire ArrayList in Array.
compagno
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.