Jak podzielić ciąg oddzielony przecinkami?


202

Mam ciąg o nieznanej długości, który wygląda mniej więcej tak

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

Jaki byłby optymalny sposób podziału tego ciągu na przecinki, aby każde słowo mogło stać się elementem ArrayList?

Na przykład

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.

1
użyj metody split („spliting char”), która podzieli łańcuch znaków, a metoda utworzy tablicę łańcuchów ze podzielonymi słowami.
Simon Dorociak

Odpowiedzi:


343

Możesz to zrobić:

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

Zasadniczo .split()metoda podzieli ciąg zgodnie z (w tym przypadku) ogranicznikiem, który przekazujesz i zwróci tablicę ciągów.

Wygląda jednak na to, że szukasz listy ciągów, a nie tablicy, więc tablica musi zostać przekształcona w listę za pomocą Arrays.asList()narzędzia. Jako FYI możesz również zrobić coś takiego:

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

Ale zwykle lepszą praktyką jest programowanie do interfejsu niż do konkretnej konkretnej implementacji, dlatego poleciłbym pierwszą opcję.


9
Pamiętaj, że to nie przycina wartości, więc strings.get (1) będzie „cat”, a nie „cat”
Alb

45
str.splitakceptuje wyrażenia regularne, dzięki czemu możesz użyć, str.split(",[ ]*");aby usunąć przecinki i spacje po przecinkach.
vertti

4
Plik rozdzielany przecinkami (csv) może zawierać przecinek w cudzysłowie, co oznacza, że ​​nie jest to separator. W takim przypadku Split nie będzie działać.
Steven Trigg

2
Druga opcja wymaga jak w obsadzie ArrayList<String>.
C_B

3
Jeśli chcesz zachować puste wpisy (np. Dla spójnej długości tablicy), użyj split (",", - 1) zgodnie z stackoverflow.com/questions/14602062
Fast Engy

157

Chcesz się podzielić , prawda?

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

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

Jeśli chcesz dodatkowo pozbyć się białych znaków wokół przedmiotów:

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

Tak, to część rozwiązania. Wygląda na to, że OP szuka listy ciągów, a nie tablicy.
npinti

@npinti: tak, +1 do ciebie, byłeś szybszy i nie chciałem kopiować twojego Arrays.asList()idiomu.
Tomasz Nurkiewicz

1
Myślałem przez 10 godzin, a potem szukałem SO. nie wiedziałem, że tak łatwo jest .split ();
DeathRs,

Co jeśli chcesz przechowywać wynikowe podzielone elementy w zestawie zamiast w tablicy?
Mojżesz Kirathe,

29

Możesz go podzielić i utworzyć tablicę, a następnie uzyskać dostęp jak tablica

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

masz dostęp jak

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

lub za pomocą pętli

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

mam nadzieję, że ci to pomoże.


18

Mała poprawka: powyższe rozwiązania nie usuwają spacji wiodących ani końcowych w rzeczywistym łańcuchu. Lepiej zadzwonić do przycinania przed wywołaniem split. Zamiast tego,

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

posługiwać się

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

1
dla twojego drugiego wiersza, jeśli użyjemy trim (), to nie potrzebujemy podziału przestrzeni, jak ("\\s*,\\s*")tylko użycie (",");tego spowoduje takie same wyniki.
WIZARD,

5
Nie jestem pewien, czy @WIZARD, ponieważ przycinanie usuwa tylko lewą i prawą spację ciągu, ale nie spację w nim. Tak trim(" string, with , space ")będzie "string, with , space".
Thomas Leduc

@ThomasLeduc, jeśli ciąg znaków jest taki, to "dog, cat, bear, elephant, giraffe"nie ma potrzeby, trim()a jeśli tak, to jeśli użyjesz, wypakuj nie trim()będzie "string,with,space"to"string, with , space"
WIZARD

trim()usunie wszystkie spacje, nie tylko lewą i prawą spację ciągu
WIZARD

5
Testujesz to? ponieważ właśnie napisałem program Java i ciąg znaków " string, with , space ".trim()zwraca "string, with , space". Jak mówi javadoc: zwraca kopię łańcucha, z pominiętą początkową i końcową spacją. Mylisz się, a @ user872858 ma rację.
Thomas Leduc

3

Najpierw możesz podzielić takie nazwy

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

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

uzyskać dostęp do swoich zwierząt

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

A także chcesz usunąć białe spacje i przecinki wokół nazw zwierząt

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

3

Aby uzyskać kompletność, użyj Guawy biblioteki , możesz: Splitter.on(",").split(“dog,cat,fox”)

Inny przykład:

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()zwraca Iterable, więc jeśli potrzebujesz Listy, zawiń ją Lists.newArrayList()jak wyżej. W przeciwnym razie wybierz Iterable, na przykład:

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

Zwróć uwagę, jak trimResults()radzi sobie ze wszystkimi potrzebami przycinania, bez konieczności modyfikowania wyrażeń regularnych dla przypadków narożnych , jak w przypadkuString.split() .

Jeśli twój projekt korzysta już z Guawy, powinno to być twoje preferowane rozwiązanie. Zobacz dokumentację Splittera w Guava User Guide lub javadocs, aby uzyskać więcej opcji konfiguracji.


2

Może spróbować z tym działało dla mnie

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

albo

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

1

w build.gradle dodaj Guava

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

i wtedy

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

cieszyć się :)


0

Usuń wszystkie białe spacje i utwórz listę o stałym rozmiarze lub niezmienną (patrz asList dokumentacja API )

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

Możliwe jest również użycie, replaceAll(\\s+", "")ale maksymalna wydajność zależy od przypadku użycia. (patrz odpowiedź @GurselKoca na Usuwanie białych znaków z ciągów znaków w Javie )


0

Możesz użyć czegoś takiego:

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

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

Uwzględnij również biblioteki lib:

import java.util.ArrayList;
import java.util.Arrays; 
import java.util.List;


0

W Kotlinie

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

gdzie stringArrayjest List<String>i commasStringjest Stringz przecinkami i spacjami


0

Jest to łatwy sposób na rozdzielenie ciągu przecinkami,

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

Ten kod użyłem dla JDK. A jeśli musisz wydrukować tablicę. użyj System.out.println
Sandun Susantha

-1

Istnieje funkcja o nazwie, replaceAll()która może usunąć wszystkie białe znaki, zastępując je dowolną wartością. Jako przykład

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

da tobie:

First:15.94, Second:16.01
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.