Як перетворити рядок, розділений комами, в ArrayList?


538

Чи є в Java якийсь вбудований метод, який дозволяє нам конвертувати String, відокремлений комами, в якийсь контейнер (наприклад, масив, Список або Вектор)? Або мені потрібно написати спеціальний код для цього?

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 Хоча це не те, про що просив ОП
Crowie

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

@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(" , ")));

Або, використовуючи Guava :

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
Тепер у Guava це (15.0): Splitter.on (","). SplitToList (рядок) . Економить невеликий крок.
Kango_V

Чи є можливість також додати порожні значення в String iike, якщо у мене 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
Після вбудовування змінної елементів це в основному те саме, що й інші відповіді, але насправді трохи ефективніше, оскільки в ній не використовується регулярний вираз. На зворотному боці пробіли навколо коми ставлять цей параметр.
Amrinder Arora

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 Streams , що дасть вам більше користі, якщо воно буде частиною конвеєра для подальшої обробки.

Обернувши результат функції .split (власний масив) у потік, а потім перетворившись у список.

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

Якщо важливо, щоб результат зберігався у ArrayListвідповідності до назви з ОП, ви можете використовувати інший 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 потокового потоку є дуже потужним, дозволяючи щоб конвеювати свої операції одна за одною.

Заради, знаєте, повноти.


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

1
Одна з найкращих відповідей зараз. Список можна змінити у цій відповіді +1.
Седрік

працює після того, як змінено collect(toList())наcollect(Collectors.toList()
Sundararaj Govindasamy

Насправді collect(toList())використовується статичний імпорт Collectors.toList()для стислості та вільності :)
Ману,

15

Для цього немає вбудованого методу, але ви можете просто використовувати метод split ().

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


10

ви можете комбінувати якList та split

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


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,"; Список <String> splittedString = новий ArrayList <String> (Arrays.asList (s.split ("\\ s *, \\ s *")));
Сонячно

1
Це нове запитання, не задавайте це як коментар. Сміливо створіть нове запитання.
Джордж Сіґуроглоу

2

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


2

У groovy ви можете використовувати метод tokenize (символ Token):

list = str.tokenize(',')

Цей мене врятував! Дякую.
tamerlaha

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

У Котліні, якщо ваш список рядків подібний до цього, і ви можете використовувати для перетворення рядка в 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[] 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? Ви навіть читали запитання?
Дебосміт Рей

@mapeters: Був а ArrayList. Я повернув правки до першої редакції (щоб ви могли це побачити) та покращив форматування першої редакції.
дур

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