Как преобразовать разделенную запятыми строку в ArrayList?


538

Есть ли какой-либо встроенный метод в Java, который позволяет нам преобразовывать разделенную запятыми строку в некоторый контейнер (например, массив, список или вектор)? Или мне нужно написать собственный код для этого?

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

Если вы хотите , чтобы разобрать CSV см stackoverflow.com/questions/3908012/parsing-csv-in-java
Raedwald

@Raedwald Это не то, о чем попросил ОП
Кроу

3
ТОЛЬКО ответ ColinD здесь верный, при условии, что вы хотите ArrayList, как в заголовке вопроса. ArrayList (который является изменяемым) полностью отличается от List, который может быть просто фиксированным списком.
Толстяк

@Fattie - справедливая точка, и исправил это - stackoverflow.com/a/34735419/744133
YoYo

Ответы:


1016

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

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

Приведенный выше код разбивает строку на разделитель, определенный как:, zero or more whitespace, a literal comma, zero or more whitespaceкоторый поместит слова в список и сведет все пробелы между словами и запятыми.


Обратите внимание, что это возвращает просто оболочку для массива: вы НЕ МОЖЕТЕ, например, получить .remove()результат List. Для фактического ArrayListвы должны в дальнейшем использовать new ArrayList<String>.


39
@rosch Это регулярное выражение (регулярное выражение). \sсоответствует любому пробелу, *применяется совпадение ноль или более раз. Так \s*значит «совпадать с любым пробелом ноль или более раз». Мы ищем это до и после запятой. Следовательно, разбиение будет работать для таких строк, как "item1 , item2 , item3", или "item1,item2 ,item3", и т. Д. В Java вам нужно избежать обратной косой черты в строках, так что вы получите\\s*
andrewrjones

9
Я предлагаю использовать "[\\s,]+"для обрезки пробелов для значений. Например, " item1 , item2 , item3 , "становится ["item1", "item2", "item3"].
Андрей Немченко

5
"[\\s,]+"также разделит внутреннее пространство внутри токена, разделенного запятыми, он будет рассматривать оба пробела как разделитель, даже если запятая отсутствует, вместо запятой плюс любое количество окружающих пробелов. "\\s*(,\\s*)+"будет обрезать пробелы только вокруг разделенных запятыми токенов, а также игнорировать любые строки, которые являются только пробелами или пустыми.
theferrit32

2
В качестве примечания: если вы ожидаете получить пустой список в случае пустой строки ввода, то этот метод не подходит для вашего варианта использования. Вы получите список с 1 элементом, содержащий пустую строку.
Мадис Пукконен,

3
@AlexR Хотя я ценю, что вы уважаете ОП, но я бы не стал говорить такие вещи. Я знаю людей, которые чувствуют себя плохо из-за того, что не оправдывают ожиданий людей, когда их хвалят. Просто мысль.

199

Arrays.asListвозвращает фиксированный размер, Listподдерживаемый массивом. Если вы хотите нормальную мутабельность, java.util.ArrayListвам нужно сделать это:

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

Или, используя Гуава :

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

Использование a Splitterдает вам больше гибкости в том, как вы разделяете строку, и дает вам возможность, например, пропускать пустые строки в результатах и ​​обрезать результаты. У него также менее странное поведение, чем то, String.splitчто вам не нужно разделять по регулярным выражениям (это только один из вариантов).


6
Предпочел бы Splitter.on (","). TrimResults (). Split (string), хотя я вижу, вы упоминали об этом. так что +1
Джон Б

10
+1 за указание на то, что Arrays.asList не возвращает нормальный список. Если вы попытаетесь добавить или удалить элемент из этого списка, вы получите исключение UnsupportedOperationException.
Альфредо Осорио

9
Гуава теперь имеет это, так как (15.0): Splitter.on (","). SplitToList (string) . Сохраняет маленький шаг.
Kango_V

Есть ли способ также добавить пустые значения в String, например, если у меня есть String, как это: 1, 3,4,5 здесь 2 отсутствует / пусто. При конвертации в список 2 пропущу. Но я хочу добавить это как пустое значение.
A.Aleem11

Проблема с этой реализацией и некоторыми другими подобными примерами состоит в том, что, хотя и Arrays.asListпредоставляет обертку вокруг собственного массива (избегая копирования элемента), он new ArrayList(...)будет точно выполнять такой элемент путем копирования элемента. Вероятно, нам следует предпочесть подход, позволяющий напрямую анализировать элементы в желаемой целевой коллекции.
YoYo

70

Два шага:

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

1
После того, как вы ввели переменную items, она в основном совпадает с другими ответами, но на самом деле немного более эффективна, поскольку не использует регулярные выражения. С другой стороны, пробелы вокруг запятой убьют эту опцию.
Амриндер Арора

2
@AmrinderArora аргумент для splitинтерпретируется как RegEx.
Madbreaks

23

Вот еще один для преобразования CSV в 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));
}

Печатает вас

-> строка
-> с
-> запятая


21

Если Listконечная цель, как указано в ОП, является конечной целью, то уже принятый ответ остается самым коротким и лучшим. Однако я хочу предоставить альтернативы, использующие потоки Java 8 , которые дадут вам больше преимуществ, если они будут частью конвейера для дальнейшей обработки.

Оборачивая результат функции .split (собственный массив) в поток, а затем преобразуя его в список.

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

Если важно, чтобы результат сохранялся в ArrayListсоответствии с заголовком из OP, вы можете использовать другой Collectorметод:

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

Или с помощью API синтаксического анализа RegEx:

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

Обратите внимание, что вы все равно можете оставить listтип переменной List<String>вместо ArrayList<String>. Общий интерфейс для по- Listпрежнему выглядит достаточно похожим на ArrayListреализацию.

Сами по себе эти примеры кода, кажется, не добавляют много (кроме большего набора текста), но если вы планируете делать больше, как, например, этот ответ о преобразовании String в List of Longs , потоковый API действительно мощный, позволяя направлять ваши операции один за другим.

Ради, вы знаете, полноты.


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

1
Один из лучших ответов сейчас. Список можно изменить в этом ответе +1.
Седрик

работает после изменения collect(toList())наcollect(Collectors.toList()
Сундарадж Говиндасамы

На самом деле collect(toList())используется статический импорт Collectors.toList()для краткости и беглости :)
Ману

15

Для этого нет встроенного метода, но вы можете просто использовать метод split () в этом.

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


10

Вы можете комбинировать asList и split

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

8

Этот код поможет,

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

5

Вы можете использовать Guava для разделения строки и преобразования ее в ArrayList. Это также работает с пустой строкой и возвращает пустой список.

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

выводит следующее:

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

4

Пример использования Collections.

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

1
Вы избежали посредничества Arrays.asList. К сожалению, у нас все еще есть копия из элементов массива в коллекцию. Хорошая альтернатива для запоминания.
YoYo

4

Есть много способов решить эту проблему с помощью потоков в Java 8, но IMO следующие прямые линии:

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

Кто-нибудь знает, как я могу преобразовать эту строку в список через запятую --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 *))));
Солнечное

1
Это новый вопрос, не задавайте его в качестве комментария. Не стесняйтесь создавать новый вопрос.
Джордж Сиггуроглу

2

Вы можете сначала разделить их, используя String.split(","), а затем преобразовать возвращенную строку arrayв ArrayListиспользованиеArrays.asList(array)



2

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

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

(написано в котлине)


1
В документации сказано, что эта функция бета и нестабильна.
Rubberducker


1

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

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

В Kotlin, если ваш список строк, как это, и вы можете использовать для преобразования строки в ArrayList, используйте эту строку кода

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


0

Вы можете сделать это следующим образом.

Это удаляет пробелы и разделяет их запятыми, когда вам не нужно беспокоиться о пробелах.

    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

Строка -> Преобразование коллекции : (Строка -> Строка [] -> Коллекция)

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

Коллекция -> Строка [] преобразование:

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

String -> String [] преобразование:

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

И Коллекция -> Коллекция :

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

-2

преобразовать коллекцию в строку как запятую в Java 8

Объект listOfString содержит элементы ["A", "B", "C", "D"]

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

Вывод: - «A», «B», «C», «D»

И конвертировать массив строк в список в 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
А где именно находится ArrayList? Ты вообще читал вопрос?
Debosmit Ray

@ mapeters: был ArrayList. Я откатил правки до первой ревизии (чтобы вы могли это видеть) и улучшил форматирование первой ревизии.
дур

Вопрос в том, как преобразовать строку в ArrayList, а не в том, как преобразовать ArrayList в Array.
товарищ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.