it-swarm.com.ru

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

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

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

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

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

894
AlexR

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, и не требует от вас деления на регулярные выражения (это всего лишь один из вариантов).

169
ColinD

Два шага: 

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

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

Печатает вас

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

22
Arvindvp6

Если List является конечной целью, как указано в OP, то уже принятый ответ по-прежнему самый короткий и лучший. Однако я хочу предоставить альтернативы, использующие 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 действительно мощный, позволяя направлять ваши операции один за другим. 

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

17
YoYo

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

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

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

13
Jason Wheeler
List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(toList());
12
Manu

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

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

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

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

Вы можете использовать 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]
5
Brad Parks

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

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

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

2
Saket

Есть много способов решить эту проблему, используя потоки в 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());
2
i_am_zero

В groovy вы можете использовать метод tokenize (Character Token):

list = str.tokenize(',')
1
sivareddy963

Я обычно использую предварительно скомпилированный шаблон для списка. А также это немного более универсально, так как он может рассматривать скобки, которые следуют за некоторыми выражениями 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
Jan Stanicek
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));

// enter code here
1
deepu kumar singh
List<String> items = Arrays.asList(s.split("[,\\s]+"));
0
Nenad Bulatovic

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

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

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

0
anoopbryan2

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

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

    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);
0
Dulith De Costa