Wie konvertiere ich einen durch Kommas getrennten String in ArrayList?


538

Gibt es in Java eine integrierte Methode, mit der wir durch Kommas getrennte Zeichenfolgen in einen Container (z. B. Array, Liste oder Vektor) konvertieren können? Oder muss ich dafür benutzerdefinierten Code schreiben?

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

Wenn Sie CSV analysieren möchten, sehen Sie stackoverflow.com/questions/3908012/parsing-csv-in-java
Raedwald

@ Raedwald Das ist aber nicht das, wonach OP gefragt hat
Crowie

3
NUR die Antwort von ColinD ist hier richtig, vorausgesetzt, Sie möchten eine ArrayList wie im Fragentitel. ArrayList (das veränderbar ist) unterscheidet sich grundlegend von List, die nur eine einfache feste Liste sein kann.
Fattie

@Fattie - fairer Punkt, und behoben, dass - stackoverflow.com/a/34735419/744133
YoYo

Antworten:


1016

Konvertieren Sie einen durch Kommas getrennten String in eine Liste

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

Der obige Code teilt die Zeichenfolge in ein Trennzeichen auf, das wie zero or more whitespace, a literal comma, zero or more whitespacefolgt definiert ist: Dadurch werden die Wörter in die Liste eingefügt und Leerzeichen zwischen den Wörtern und Kommas werden reduziert.


Bitte beachten Sie, dass dies einfach einen Wrapper auf einem Array zurückgibt: Sie können zum Beispiel NICHT.remove() aus dem Ergebnis List. Für eine tatsächlicheArrayList müssen Sie weiter verwenden new ArrayList<String>.


39
@rosch Es ist ein regulärer Ausdruck (Regex). \sEntspricht einem beliebigen Leerzeichen. Der *Wendet die Übereinstimmung null oder mehrmals an. Bedeutet \s*also "mit einem Leerzeichen null oder mehrmals übereinstimmen". Wir suchen dies vor und nach dem Komma. Daher funktioniert die Aufteilung für Zeichenfolgen wie "item1 , item2 , item3", oder "item1,item2 ,item3"usw. In Java müssen Sie den Backslash in Zeichenfolgen \\s*
umgehen

9
Ich schlage vor, "[\\s,]+"Leerzeichen für Werte zu kürzen. Zum Beispiel " item1 , item2 , item3 , "wird ["item1", "item2", "item3"].
Andrii Nemchenko

5
"[\\s,]+"Wird auch auf den internen Bereich innerhalb eines durch Kommas getrennten Tokens aufgeteilt, behandelt es beide Leerzeichen als Trennzeichen, auch wenn kein Komma vorhanden ist, anstelle eines Kommas plus einer beliebigen Anzahl von umgebenden Leerzeichen. "\\s*(,\\s*)+"schneidet Leerzeichen nur um durch Kommas getrennte Token und ignoriert auch alle Zeichenfolgen, die nur Leerzeichen oder leer sind.
Theferrit32

2
Als Randnotiz: Wenn Sie bei einer leeren Eingabezeichenfolge eine leere Liste erwarten, passt diese Methode nicht zu Ihrem Anwendungsfall. Sie erhalten eine Liste mit 1 Element, das eine leere Zeichenfolge enthält.
Madis Pukkonen

3
@AlexR Ich weiß zwar zu schätzen, dass Sie das OP respektieren, aber ich würde es unterlassen, solche Dinge zu sagen. Ich kenne Leute, die sich schlecht fühlen, weil sie die Erwartungen der Leute nicht erfüllen, wenn sie falsch gelobt werden. Nur ein Gedanke.

199

Arrays.asListGibt eine feste Größe Listzurück, die vom Array unterstützt wird. Wenn Sie ein normales Mutable java.util.ArrayListwollen, müssen Sie dies tun:

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

Oder mit Guave :

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

Durch die Verwendung von a erhalten SplitterSie mehr Flexibilität beim Teilen der Zeichenfolge und können beispielsweise leere Zeichenfolgen in den Ergebnissen überspringen und Ergebnisse zuschneiden. Es hat auch weniger seltsames Verhalten als String.splitund erfordert nicht, dass Sie nach regulären Ausdrücken aufteilen (das ist nur eine Option).


6
Hätte Splitter.on (","). TrimResults (). Split (string) vorgezogen , obwohl ich sehe, dass Sie es erwähnt haben. also +1
John B

10
+1 für den Hinweis, dass Arrays.asList keine normale Liste zurückgibt. Wenn Sie versuchen, ein Element zu / von dieser Liste hinzuzufügen oder zu entfernen, erhalten Sie eine UnsupportedOperationException.
Alfredo Osorio

9
Guava hat dies nun seit (15.0): Splitter.on (","). SplitToList (string) . Speichert einen kleinen Schritt.
Kango_V

Gibt es eine Möglichkeit, auch leere Werte in String iike hinzuzufügen, wenn ich einen String wie diesen habe: 1 ,, 3,4,5 hier 2 fehlt / leer. Beim Konvertieren in Liste 2 wird übersprungen. Aber ich möchte dies als leeren Wert hinzufügen.
A.Aleem11

Das Problem bei dieser Implementierung und einigen anderen ähnlichen Beispielen besteht darin, dass, obwohl Arrays.asListein Wrapper um das native Array bereitgestellt wird (Vermeidung einer Elementkopie), new ArrayList(...)eine solche Element-für-Element-Kopie genau ausgeführt wird. Wir sollten wahrscheinlich einen Ansatz bevorzugen, mit dem analysierte Elemente direkt zur gewünschten Zielsammlung hinzugefügt werden können.
YoYo

70

Zwei schritte:

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

1
Sobald Sie die Elementvariable inline haben, ist sie im Grunde die gleiche wie bei anderen Antworten, jedoch etwas effizienter, da kein regulärer Ausdruck verwendet wird. Auf der anderen Seite wird diese Option durch Leerzeichen um das Komma beendet.
Amrinder Arora

2
@AmrinderArora Das Argument an splitwird als RegEx interpretiert.
Madbreaks

23

Hier ist eine andere für die Konvertierung von 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));
}

Druckt Sie

-> Zeichenfolge
-> mit
-> Komma


21

Wenn a Listdas Endziel ist, wie im OP angegeben, ist die bereits akzeptierte Antwort immer noch die kürzeste und beste. Ich möchte jedoch Alternativen mit Java 8-Streams bereitstellen , die Ihnen mehr Nutzen bringen, wenn sie Teil einer Pipeline für die weitere Verarbeitung sind.

Indem Sie das Ergebnis der .split-Funktion (ein natives Array) in einen Stream einbinden und dann in eine Liste konvertieren.

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

Wenn es wichtig ist, dass das Ergebnis ArrayListgemäß dem Titel aus dem OP gespeichert wird , können Sie eine andere CollectorMethode verwenden:

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

Oder mithilfe der RegEx-Parsing-API:

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

Beachten Sie, dass Sie die listVariable weiterhin als List<String>anstelle von eingeben können ArrayList<String>. Die generische Oberfläche für Listsieht immer noch ziemlich ähnlich aus wie dieArrayList Implementierung .

An sich scheinen diese Codebeispiele nicht viel hinzuzufügen (außer mehr Eingabe), aber wenn Sie vorhaben, mehr zu tun, wie diese Antwort zum Konvertieren eines Strings in eine Liste von Longs zeigt, ist die Streaming-API wirklich leistungsfähig, indem sie dies zulässt um Ihre Operationen nacheinander zu leiten.

Der Vollständigkeit halber.


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

1
Eine der besten Antworten jetzt. Liste kann in dieser Antwort +1 geändert werden.
Sedrick

arbeitet nach geändert collect(toList())zucollect(Collectors.toList()
Sundararaj Govindasamy

In der Tat collect(toList())wird der statische Import von Collectors.toList()für Kürze und Geläufigkeit verwendet :)
Manu

15

Hierfür gibt es keine integrierte Methode, aber Sie können hier einfach die split () -Methode verwenden.

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

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

Das sollte für dich funktionieren.


10

Sie können asList und split kombinieren

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

8

Dieser Code wird helfen,

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

5

Sie können Guava verwenden, um die Zeichenfolge zu teilen und in eine ArrayList zu konvertieren. Dies funktioniert auch mit einer leeren Zeichenfolge und gibt eine leere Liste zurück.

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

gibt Folgendes aus:

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

4

Ein Beispiel mit Collections.

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

1
Sie haben die zwischengeschaltete Arrays.asList vermieden. Leider haben wir noch eine Kopie von Array-Elementen in der Sammlung. Schöne Alternative zum Erinnern.
YoYo

4

Es gibt viele Möglichkeiten, dies mithilfe von Streams in Java 8 zu lösen, aber IMO sind die folgenden Einzeiler unkompliziert:

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

Weiß jemand, wie ich diesen String in eine durch Kommas getrennte Liste konvertieren kann --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
Dies ist eine neue Frage, stellen Sie sie nicht als Kommentar. Fühlen Sie sich frei, eine neue Frage zu erstellen.
George Siggouroglou

2

Sie können sie zuerst mit using teilen String.split(",")und dann den zurückgegebenen String arrayin einen ArrayListusing konvertierenArrays.asList(array)


2

In groovy können Sie die Tokenize-Methode (Character Token) verwenden:

list = str.tokenize(',')

Dieser hat mich gerettet! Vielen Dank.
Tamerlaha

2

Das gleiche Ergebnis können Sie mit der Splitter-Klasse erzielen.

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

(geschrieben in Kotlin)


1
Die Dokumentation besagt, dass diese Funktion Beta und instabil ist.
Rubberducker

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

// enter code here

1

Normalerweise verwende ich ein vorkompiliertes Muster für die Liste. Und dies ist auch etwas universeller, da es Klammern berücksichtigen kann, die einigen der listToString-Ausdrücke folgen.

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

Wenn Ihre String-Liste in Kotlin so ist und Sie sie zum Konvertieren von String in ArrayList verwenden können, verwenden Sie diese Codezeile

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


0

Sie können dies wie folgt tun.

Dadurch werden Leerzeichen entfernt und durch Kommas getrennt, sodass Sie sich keine Gedanken über Leerzeichen machen müssen.

    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 -> Sammlungskonvertierung : (String -> String [] -> Sammlung)

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

Sammlung -> String [] Konvertierung:

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

String -> String [] Konvertierung:

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

Und Sammlung -> Sammlung :

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

-2

Konvertieren Sie Collection in einen in Java 8 getrennten Komma

listOfString-Objekt enthält ["A", "B", "C", "D"] Elemente-

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

Die Ausgabe ist: - 'A', 'B', 'C', 'D'

Und konvertieren Sie Strings Array in List 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
Und wo genau ist das ArrayList? Hast du die Frage überhaupt gelesen?
Debosmit Ray

@mapeters: Es gab eine ArrayList. Ich habe die Änderungen auf die erste Revision zurückgesetzt (damit Sie sie sehen können) und die Formatierung der ersten Revision verbessert.
Während des

Die Frage ist, wie ein String in ArrayList konvertiert wird, nicht wie ArrayList in Array konvertiert wird.
Genosse
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.