Как разбить строку через запятую?


202

У меня есть строка с неизвестной длиной, которая выглядит примерно так

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

Каков оптимальный способ разделить эту строку запятыми, чтобы каждое слово могло стать элементом ArrayList?

Например

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
Используйте метод split («split char»), он разбивает ваш метод строки и создаст массив строк с разделенными словами.
Симон Дорочак

Ответы:


343

Вы могли бы сделать это:

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

В основном .split() метод разбивает строку в соответствии с (в данном случае) разделителем, который вы передаете, и возвращает массив строк.

Тем не менее, вы, кажется, следите за списком строк, а не за массивом, поэтому массив должен быть превращен в список с помощью Arrays.asList()утилиты. Так же, как к вашему сведению, вы можете сделать что-то вроде этого:

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

Но обычно лучше программировать на интерфейс, а не на конкретную реализацию, поэтому я бы порекомендовал первый вариант.


9
Имейте в виду, что это не обрезает значения, поэтому strings.get (1) будет «cat», а не «cat»
Alb

45
str.splitпринимает регулярные выражения, так что вы можете использовать, str.split(",[ ]*");чтобы убрать запятые и пробелы после запятых.
Вертти

4
Файл с разделителями-запятыми (csv) может иметь запятую в кавычках, то есть это не разделитель. В этом случае Split не будет работать.
Стивен Тригг

2
Второй вариант требует как приведено ArrayList<String>.
C_B

3
Если вам нужно сохранить пустые записи (например, для одинаковой длины массива), используйте split (",", - 1) согласно stackoverflow.com/questions/14602062/…
Fast Engy

157

Ну, вы хотите разделить , верно?

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

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

Если вы хотите дополнительно избавиться от пробелов вокруг предметов:

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

Да, это часть решения. Кажется, что OP идет после списка строк, а не массива.
npinti

@npinti: да, +1 для вас, вы были быстрее, и я не хотел копировать вашу Arrays.asList()идиому.
Томаш Нуркевич

1
Я продолжал думать в течение 10 часов, затем искал ТАК. не знал, что так легко .split ();
DeathRs 12.12.15

Что делать, если вы хотите сохранить полученные элементы разбиения в наборе, а не в массиве?
Моисей Кирате

29

Вы можете разделить его и сделать массив, а затем получить доступ как массив

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

вы можете получить доступ как

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

или с помощью цикла

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

надеюсь, это поможет вам.


18

Небольшое улучшение: вышеприведенные решения не будут удалять начальные или конечные пробелы в фактической строке. Лучше вызвать трим, прежде чем вызывать сплит. Вместо этого,

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

использование

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

1
для вашей второй строки, если мы используем trim (), то нам не нужно разделять пробел, как ("\\s*,\\s*")только использование (",");этого приведет к тому же результату.
Волшебник

5
Я не уверен в этом @WIZARD, потому что отделка удаляет только левый и правый пробел строки, но не пробел в ней. Так trim(" string, with , space ")будет "string, with , space".
Томас Ледук

@ThomasLeduc, если строка такая, "dog, cat, bear, elephant, giraffe"то в этом нет необходимости, trim()а в случае, если ее использовать, trim()то выход будет "string,with,space"не таким"string, with , space"
WIZARD

trim()удалит все пробелы, а не только левый и правый пробел строки
WIZARD

5
Вы проверяете это? потому что я только что написал программу Java и строку " string, with , space ".trim()возврата "string, with , space". Как говорит javadoc: возвращает копию строки, пропуская начальные и конечные пробелы. Вы не правы, а @ user872858 прав.
Томас Ледук

3

Сначала вы можете разделить имена, как это

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

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

Доступ к вашим животным

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

А также вы хотите удалить пробелы и запятую вокруг имен животных

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

3

Для полноты, используя библиотеку Guava , вы должны сделать: Splitter.on(",").split(“dog,cat,fox”)

Другой пример:

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()возвращает Iterable, поэтому, если вам нужен List, оберните его, Lists.newArrayList()как указано выше. В противном случае просто используйте Iterable, например:

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

Обратите внимание, как trimResults()обрабатывает все ваши потребности обрезки без необходимости настраивать регулярные выражения для угловых случаев , как с String.split().

Если ваш проект уже использует Guava, это должно быть вашим предпочтительным решением. Посмотрите документацию Splitter в Руководстве пользователя Guava или javadocs для большего количества опций конфигурации.


2

Может попробовать с этим сработало у меня

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

или еще

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

1

в build.gradle добавить гуаву

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

а потом

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

наслаждаться :)


0

Удалите все пробелы и создайте фиксированный или неизменный список (см. asList API документы )

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

Можно также использовать, replaceAll(\\s+", "")но максимальная эффективность зависит от варианта использования. (см. @GurselKoca ответ на Удаление пробелов из строк в Java )


0

Вы можете использовать что-то вроде этого:

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

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

Кроме того, вы бы включили библиотеки:

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


0

В Котлине

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

где stringArrayэто List<String>и commasStringесть Stringзапятые и пробелы


0

Это простой способ разбить строку через запятую,

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

Этот код я использовал для JDK. И если вам нужно распечатать массив. используйте System.out.println
Сандун Сусанта

-1

Существует функция, replaceAll()которая может удалить все пробелы, заменив их тем, что вы хотите. Например

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

дам тебе:

First:15.94, Second:16.01
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.