Как преобразовать разделенную запятыми строку в ArrayList? - PullRequest
493 голосов
/ 20 сентября 2011

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

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

Ответы [ 23 ]

941 голосов
/ 20 сентября 2011

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

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

182 голосов
/ 20 сентября 2011

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

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

67 голосов
/ 20 сентября 2011

Два шага:

  1. String [] items = commaSeparated.split("\\s*,\\s*");
  2. List<String> container = Arrays.asList(items);
22 голосов
/ 10 февраля 2014

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

печатает вас

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

20 голосов
/ 12 января 2016

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

Обтеканием результата функции .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.

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

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

15 голосов
/ 23 сентября 2011

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

String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = 
new  ArrayList<String>(Arrays.asList(commaSeparated.split(",")));
14 голосов
/ 30 марта 2017
List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(toList());
13 голосов
/ 20 сентября 2011
List<String> items = Arrays.asList(commaSeparated.split(","));

Это должно сработать для вас.

10 голосов
/ 20 сентября 2011

вы можете объединить asList и split

Arrays.asList(CommaSeparated.split("\\s*,\\s*"))
7 голосов
/ 13 ноября 2014

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

String myStr = "item1,item2,item3";
List myList = Arrays.asList(myStr.split(","));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...