Як розділити рядок, розділений комою?


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 ("розбиття char"), він розбиває ваш строковий метод і створить масив рядків з розділеними словами.
Симон Дорочак

Відповіді:


343

Ви можете це зробити:

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

В основному .split()метод розділить рядок відповідно до (у цьому випадку) роздільника, який ви проходите, і поверне масив рядків.

Однак, здається, ви перебуваєте після списку рядків, а не масиву, тому масив потрібно перетворити на список за допомогою Arrays.asList()утиліти. Як FYI ви також можете зробити щось подібне:

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

Але зазвичай краще використовувати програмування на інтерфейс, а не на фактичну конкретну реалізацію, тому я рекомендував би 1-й варіант.


9
Майте на увазі, що це не обріже значення, тому strings.get (1) буде "cat", а не "cat"
Альб

45
str.splitприймає регулярний вираз, щоб ви могли використовувати його, str.split(",[ ]*");щоб ви видаляли коми та пробіли після коми.
vertti

4
У файлі з обмеженими комами (csv) може бути котировка aa, тобто це не роздільник. У цьому випадку Спліт не працюватиме.
Стівен Тригг

2
Другий варіант вимагає в якості передачі ArrayList<String>.
C_B

3
Якщо вам потрібно зберегти порожні записи (eg.for постійної довжини масиву) використання спліт ( «», - 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*");

Так, це частина рішення. Здається, що ОП після списку рядків, а не масиву.
npinti

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

1
Я 10 годин думав, потім шукав ТАК. не знав, що так легко .split ();
DeathRs

Що робити, якщо ви хочете зберігати отримані розділені елементи в наборі, а не в масиві?
Мойсей Кірате

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"
ЧАСТИНА

trim()видалить усі пробіли не лише лівого та правого простору рядка
WIZARD

5
Ви тестуєте це? тому що я щойно написав програму java та " string, with , space ".trim()return string "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, тому якщо вам потрібен Список, загорніть його, Lists.newArrayList()як вище. В іншому випадку просто перейдіть з Iterable, наприклад:

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

Зверніть увагу, як ви trimResults()справляєтесь з усіма потребами в обробці без необхідності підправляти реджекси для кутових корпусів , як це стосуєтьсяString.split() .

Якщо ваш проект вже використовує Guava, це має бути вашим кращим рішенням. Дивіться документацію про спліттер у Посібнику користувача Guava або javadocs для отримання додаткових параметрів конфігурації.


2

Можу спробувати з цим працював для мене

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

інакше

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

1

в build.gradle додати Guava

    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
Sandun Susantha

-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.