Czy jest jakaś wbudowana metoda w Javie, która pozwala nam konwertować ciąg znaków rozdzielany przecinkami na jakiś kontener (np. Tablicę, listę lub wektor)? Czy też muszę do tego napisać niestandardowy kod?
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = //method that converts above string into list??
java
string
collections
split
Jame
źródło
źródło
Odpowiedzi:
Konwertuj łańcuch rozdzielony przecinkami na listę
Powyższy kod dzieli ciąg na separator zdefiniowany jako:,
zero or more whitespace, a literal comma, zero or more whitespace
który umieści słowa na liście i zwinie wszelkie spacje między słowami a przecinkami.Pamiętaj, że to zwraca po prostu opakowanie w tablicy: NIE MOŻESZ na przykład
.remove()
wynikać z wynikowegoList
. W rzeczywistościArrayList
musisz dalej korzystaćnew ArrayList<String>
.źródło
\s
pasuje do dowolnej białej spacji,*
stosuje dopasowanie zero lub więcej razy.\s*
Oznacza to więc „dopasuj dowolną białą spację zero lub więcej razy”. Szukamy tego przed i po przecinku. Dlatego podział będzie działał dla ciągów takich jak"item1 , item2 , item3"
,"item1,item2 ,item3"
itp. W Javie musisz uciec przed odwrotnym ukośnikiem w ciągach, więc otrzymasz\\s*
"[\\s,]+"
do przycięcia białych znaków dla wartości. Na przykład" item1 , item2 , item3 , "
staje się["item1", "item2", "item3"]
."[\\s,]+"
podzieli się również na przestrzeń wewnętrzną w tokenie oddzielonym przecinkami, potraktuje obie białe znaki jako separator, nawet gdy przecinek nie jest obecny, zamiast przecinka plus dowolna liczba otaczających białych znaków."\\s*(,\\s*)+"
przycina białe znaki tylko wokół tokenów oddzielonych przecinkami, a także ignoruje ciągi znaków, które są tylko białymi lub pustymi znakami.Arrays.asList
zwraca stały rozmiarList
wspierany przez tablicę. Jeśli chcesz normalnego mutablejava.util.ArrayList
, musisz to zrobić:Lub za pomocą Guava :
Użycie a
Splitter
daje większą elastyczność w dzieleniu łańcucha i daje możliwość, na przykład, pomijania pustych łańcuchów w wynikach i przycinania wyników. Ma również mniej dziwne zachowanie niżString.split
nie wymaga dzielenia przez regex (to tylko jedna opcja).źródło
Arrays.asList
zapewnia ona owijanie wokół natywnej tablicy (unikając kopiowania elementu),new ArrayList(...)
dokładnie wykona taką kopię element po elemencie. Prawdopodobnie powinniśmy preferować podejście, które pozwala na bezpośrednie dodawanie przeanalizowanych elementów do pożądanej kolekcji docelowej.Dwa kroki:
String [] items = commaSeparated.split("\\s*,\\s*");
List<String> container = Arrays.asList(items);
źródło
split
jest interpretowany jako RegEx.Oto kolejny sposób konwersji CSV na ArrayList:
Drukuje cię
źródło
Jeśli a
List
jest celem końcowym, jak stwierdził PO, to już zaakceptowana odpowiedź jest wciąż najkrótsza i najlepsza. Chciałbym jednak przedstawić alternatywne rozwiązania wykorzystujące strumienie Java 8 , które przyniosą więcej korzyści, jeśli będą częścią potoku do dalszego przetwarzania.Zawijając wynik funkcji .split (macierz macierzysta) do strumienia, a następnie konwertując na listę.
Jeśli ważne jest, aby wynik był zapisany jak
ArrayList
w tytule z PO, możesz użyć innejCollector
metody:Lub używając interfejsu analizującego RegEx:
Zauważ, że nadal możesz rozważyć pozostawienie
list
zmiennej wpisanej jakoList<String>
zamiastArrayList<String>
. Ogólny interfejs dlaList
nadal wygląda dość podobnie doArrayList
implementacji.Same przykłady w kodzie nie wydają się dużo dodawać (oprócz więcej pisania), ale jeśli planujesz zrobić więcej, na przykład ta odpowiedź na temat konwersji ciągu znaków na listę długich , interfejs API przesyłania strumieniowego jest naprawdę potężny, ponieważ umożliwia aby potokować swoje operacje jedna po drugiej.
Ze względu na kompletność.
źródło
źródło
collect(toList())
nacollect(Collectors.toList()
collect(toList())
używa statycznego importuCollectors.toList()
dla zwięzłości i płynności :)Nie ma do tego wbudowanej metody, ale możesz po prostu użyć w tym celu metody split ().
źródło
To powinno ci pomóc.
źródło
możesz łączyć asList i split
źródło
Ten kod pomoże,
źródło
Możesz użyć Guava, aby podzielić ciąg i przekonwertować go na ArrayList. Działa to również z pustym ciągiem i zwraca pustą listę.
wyprowadza następujące:
źródło
Przykład użycia
Collections
.źródło
Istnieje wiele sposobów rozwiązania tego problemu za pomocą strumieni w Javie 8, ale IMO następujące linijki są proste:
źródło
Możesz najpierw podzielić je za pomocą
String.split(",")
, a następnie przekonwertować zwrócony ciągarray
na zaArrayList
pomocąArrays.asList(array)
źródło
W groovy możesz użyć metody tokenize (token znakowy):
źródło
Ten sam wynik można osiągnąć za pomocą klasy Splitter.
(napisane w kotlin)
źródło
źródło
Zwykle używam wstępnie skompilowanego wzorca dla listy. Jest to również nieco bardziej uniwersalne, ponieważ może uwzględniać nawiasy następujące po wyrażeniach listToString.
źródło
W Kotlin, jeśli twoja lista ciągów w ten sposób i możesz użyć do konwersji ciągu na ArrayList, użyj tego wiersza kodu
źródło
źródło
Możesz to zrobić w następujący sposób.
To usuwa białe spacje i dzieli je przecinkami, dzięki czemu nie musisz się martwić o białe spacje.
źródło
String -> Konwersja kolekcji : (String -> String [] -> Collection)
Kolekcja -> Konwersja ciągu [] :
Konwersja String -> String [] :
I Kolekcja -> Kolekcja :
źródło
konwertuj Collection na ciąg znaków jako przecinek oddzielony w Javie 8
Obiekt listOfString zawiera elementy [„A”, „B”, „C”, „D”]
Dane wyjściowe to: - „A”, „B”, „C”, „D”
I przekonwertuj tablicę ciągów na listę w Javie 8
źródło
źródło
ArrayList
? Czy w ogóle przeczytałeś pytanie?ArrayList
. Wycofałem zmiany do pierwszej wersji (abyś mógł ją zobaczyć) i poprawiłem formatowanie pierwszej wersji.