Bagaimana cara mengubah String yang dipisahkan koma ke ArrayList?

538

Apakah ada metode built-in di Jawa yang memungkinkan kita untuk mengkonversi String yang dipisahkan koma ke beberapa wadah (misalnya array, Daftar atau Vektor)? Atau apakah saya perlu menulis kode khusus untuk itu?

String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = //method that converts above string into list??
Jame
sumber
Jika Anda ingin mengurai CSV, lihat stackoverflow.com/questions/3908012/parsing-csv-in-java
Raedwald
@Raedwald Bukan itu yang diminta OP
Crowie
3
HANYA jawaban ColinD benar di sini, dengan asumsi Anda menginginkan ArrayList seperti pada judul pertanyaan. ArrayList (yang bisa berubah-ubah) sama sekali berbeda dari List, yang bisa berupa daftar tetap yang sederhana.
Fattie
@ Fat - titik wajar, dan memperbaikinya - stackoverflow.com/a/34735419/744133
YoYo
1
Solusi Java 8: stackoverflow.com/a/46485179/1216775
akhil_mittal

Jawaban:

1016

Konversi String yang dipisahkan koma ke Daftar

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

Kode di atas membagi string pada pembatas yang didefinisikan sebagai: zero or more whitespace, a literal comma, zero or more whitespaceyang akan menempatkan kata-kata ke dalam daftar dan menciutkan spasi putih antara kata dan koma.


Harap dicatat bahwa ini mengembalikan hanya pembungkus pada array: Anda TIDAK BISA misalnya .remove()dari hasil List. Untuk aktual, ArrayListAnda harus menggunakan lebih lanjut new ArrayList<String>.

AlexR
sumber
39
@rosch Ini adalah ekspresi reguler (regex). \scocok dengan ruang putih mana pun, The *menerapkan nol pertandingan atau lebih banyak kali. Jadi \s*berarti "cocok dengan nol spasi putih atau lebih banyak". Kami mencari ini sebelum dan sesudah koma. Oleh karena itu, perpecahan akan bekerja untuk string seperti "item1 , item2 , item3", atau "item1,item2 ,item3", dll. Di Jawa, Anda harus menghindari backslash dalam string, sehingga Anda dapat\\s*
andrewrjones
9
Saya sarankan untuk menggunakan "[\\s,]+"spasi putih untuk nilai. Misalnya, " item1 , item2 , item3 , "menjadi ["item1", "item2", "item3"].
Andrii Nemchenko
5
"[\\s,]+"juga akan terpecah pada ruang internal dalam tanda yang dipisahkan koma, itu akan memperlakukan kedua spasi putih sebagai pembatas bahkan ketika koma tidak ada, bukan koma ditambah sejumlah spasi putih sekitarnya. "\\s*(,\\s*)+"akan memangkas spasi putih hanya di sekitar token yang dipisahkan koma, dan juga mengabaikan string apa pun yang hanya spasi kosong atau kosong.
theferrit32
2
Sebagai catatan: jika Anda berharap mendapatkan daftar kosong jika ada string input kosong, maka metode ini tidak cocok dengan use case Anda. Anda akan mendapatkan daftar dengan 1 elemen yang berisi string kosong.
Madis Pukkonen
3
@AlexR Meskipun saya menghargai Anda menghormati OP, tapi, saya akan menahan diri untuk tidak mengatakan hal-hal seperti itu. Saya tahu orang-orang yang merasa tidak enak karena tidak memenuhi harapan orang-orang ketika dipuji secara salah. Hanya pemikiran saja.
199

Arrays.asListmengembalikan ukuran tetap yang Listdidukung oleh array. Jika Anda ingin dapat berubah normal, java.util.ArrayListAnda perlu melakukan ini:

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

Atau, menggunakan Jambu Biji :

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

Menggunakan a Splittermemberi Anda lebih banyak fleksibilitas dalam cara Anda memisahkan string dan memberi Anda kemampuan untuk, misalnya, melewatkan string kosong dalam hasil dan memangkas hasil. Ini juga memiliki perilaku yang kurang aneh daripada String.splitdan tidak mengharuskan Anda untuk membelah dengan regex (itu hanya satu opsi).

ColinD
sumber
6
Lebih suka Splitter.on (","). TrimResults (). Split (string) meskipun saya melihat Anda memang menyebutkannya. jadi +1
John B
10
+1 untuk menunjukkan bahwa Arrays.asList tidak mengembalikan daftar normal. Jika Anda mencoba menambah atau menghapus elemen ke / dari daftar itu, Anda akan mendapatkan UnsupportedOperationException.
Alfredo Osorio
9
Guava sekarang memiliki ini sejak (15.0): Splitter.on (","). SplitToList (string) . Menghemat langkah kecil.
Kango_V
Apakah ada cara untuk juga menambahkan nilai kosong di String iike jika saya sudah String seperti ini: 1,, 3,4,5 di sini 2 hilang / kosong. Ketika mengkonversi dalam daftar 2 akan melewati. Tapi saya ingin menambahkan ini sebagai nilai kosong.
A.Aleem11
Masalah dengan implementasi ini, dan beberapa contoh lain yang serupa, adalah bahwa meskipun Arrays.asListmenyediakan pembungkus di sekitar array asli (menghindari salinan elemen), new ArrayList(...)justru akan melakukan elemen seperti itu dengan menyalin elemen. Kita mungkin lebih suka pendekatan yang memungkinkan elemen yang diurai ditambahkan langsung ke koleksi target yang diinginkan.
YoYo
70

Dua langkah:

  1. String [] items = commaSeparated.split("\\s*,\\s*");
  2. List<String> container = Arrays.asList(items);
Duffymo
sumber
1
Setelah Anda memasukkan variabel item, pada dasarnya sama dengan jawaban lain, tetapi sedikit lebih efisien karena tidak menggunakan regex. Di sisi lain, spasi di sekitar koma akan mematikan opsi ini.
Amrinder Arora
2
@AmrinderArora argumen untuk splitdiartikan sebagai RegEx.
Madbreak
23

Berikut ini satu lagi untuk mengonversi CSV ke 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));
}

Mencetak Anda

-> string
-> dengan
-> koma

Arvindvp6
sumber
21

Jika a Listadalah tujuan akhir seperti yang dinyatakan OP, maka jawaban yang sudah diterima masih yang terpendek dan terbaik. Namun saya ingin memberikan alternatif menggunakan Java 8 Streams , yang akan memberi Anda lebih banyak manfaat jika itu merupakan bagian dari pipa untuk diproses lebih lanjut.

Dengan membungkus hasil dari fungsi .split (array asli) ke dalam aliran dan kemudian mengkonversi ke daftar.

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

Jika penting bahwa hasilnya disimpan ArrayListsesuai dengan judul dari OP, Anda dapat menggunakan Collectormetode yang berbeda :

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

Atau dengan menggunakan api parsing RegEx:

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

Perhatikan bahwa Anda masih bisa mempertimbangkan untuk membiarkan listvariabel yang diketik sebagai List<String>pengganti ArrayList<String>. Antarmuka generik untuk Listmasih terlihat cukup mirip dengan ArrayListimplementasinya.

Dengan sendirinya, contoh-contoh kode ini sepertinya tidak menambahkan banyak (kecuali mengetik lebih banyak), tetapi jika Anda berencana untuk berbuat lebih banyak, seperti yang dicontohkan pada konversi String ke Daftar yang Panjang , API streaming sangat kuat dengan memungkinkan untuk menyalurkan operasi Anda satu demi satu.

Demi, Anda tahu, kelengkapan.

YoYo
sumber
19
List<String> items= Stream.of(commaSeparated.split(","))
     .map(String::trim)
     .collect(toList());
Manu
sumber
1
Salah satu jawaban terbaik sekarang. Daftar dapat diubah dalam jawaban ini +1.
Sedrick
berfungsi setelah diubah collect(toList())menjadicollect(Collectors.toList()
Sundararaj Govindasamy
Bahkan collect(toList())menggunakan impor statis Collectors.toList()untuk singkatnya dan kelancaran :)
Manu
15

Tidak ada metode bawaan untuk ini, tetapi Anda cukup menggunakan metode split () dalam hal ini.

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

Itu seharusnya bekerja untuk Anda.

Jason Wheeler
sumber
10

Anda dapat menggabungkan asList dan split

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

Kode ini akan membantu,

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

Anda dapat menggunakan Guava untuk membagi string, dan mengubahnya menjadi ArrayList. Ini berfungsi dengan string kosong juga, dan mengembalikan daftar kosong.

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

output sebagai berikut:

[item1, item2, item3]
[item1, item2, item3, another item]
Taman Brad
sumber
4

Contoh menggunakan Collections.

import java.util.Collections;
 ...
String commaSeparated = "item1 , item2 , item3";
ArrayList<String> items = new ArrayList<>();
Collections.addAll(items, commaSeparated.split("\\s*,\\s*"));
 ...
Filippo Lauria
sumber
1
Anda menghindari Array perantara.asList. Sayangnya kami masih memiliki salinan dari elemen array ke dalam koleksi. Alternatif yang bagus untuk diingat.
YoYo
4

Ada banyak cara untuk menyelesaikan ini dengan menggunakan stream di Java 8 tetapi IMO yang berikut ini lurus ke depan:

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());
akhil_mittal
sumber
Adakah yang tahu bagaimana saya bisa mengonversi String ini menjadi koma daftar terpisah --String s = "2017-07-12 23: 40: 00.0,153.76,16.140,60.00,, 56.00,"; Daftar <String> splittedString = ArrayList baru <String> (Arrays.asList (s.split ("\\ s *, \\ s *")));
Sunny
1
Ini pertanyaan baru, jangan tanya itu sebagai komentar. Jangan ragu untuk membuat pertanyaan baru.
George Siggouroglou
2

Pertama-tama Anda dapat membaginya menggunakan String.split(","), dan kemudian mengonversi String yang dikembalikan arrayke ArrayListmenggunakanArrays.asList(array)

Saket
sumber
2

Di groovy, Anda dapat menggunakan metode tokenize (Token Karakter):

list = str.tokenize(',')
sivareddy963
sumber
Yang ini menyelamatkan saya! Terima kasih.
tamerlaha
2

Hasil yang sama dapat Anda capai dengan menggunakan kelas Splitter.

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

(ditulis dalam kotlin)

anoopbryan2
sumber
1
Dokumentasi mengatakan fungsi ini beta dan tidak stabil.
Rubberducker
1
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));

// enter code here
deepu kumar singh
sumber
1

Saya biasanya menggunakan pola yang sudah dikompilasi untuk daftar. Dan juga ini sedikit lebih universal karena dapat mempertimbangkan tanda kurung yang mengikuti beberapa ekspresi 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();
Jan Stanicek
sumber
1

Di Kotlin jika daftar String Anda seperti ini dan Anda dapat menggunakan untuk mengonversi string ke ArrayList, gunakan baris kode ini

var str= "item1, item2, item3, item4"
var itemsList = str.split(", ")
Vijendra patidar
sumber
0
List<String> items = Arrays.asList(s.split("[,\\s]+"));
Nenad Bulatovic
sumber
0

Anda dapat melakukannya sebagai berikut.

Ini menghilangkan ruang putih dan membelah dengan koma di mana Anda tidak perlu khawatir tentang ruang putih.

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

String -> Conversation Collection : (String -> String [] -> Collection)

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

Koleksi -> konversi String [] :

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

String -> String [] konversi:

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

Dan Koleksi -> Koleksi :

List<String> list = new LinkedList<>(col);
Farzan Skt
sumber
-2

konversi Collection menjadi string sebagai koma yang dipisahkan di Java 8

objek listOfString berisi elemen ["A", "B", "C", "D" ]-

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

Output adalah: - 'A', 'B', 'C', 'D'

Dan Mengkonversi String Array ke Daftar di Java 8

    String string[] ={"A","B","C","D"};
    List<String> listOfString = Stream.of(string).collect(Collectors.toList());
Ajay Kumar
sumber
-4
ArrayList<HashMap<String, String>> mListmain = new ArrayList<HashMap<String, String>>(); 
String marray[]= mListmain.split(",");
jonsi
sumber
5
Dan di mana tepatnya ArrayList? Apakah Anda bahkan membaca pertanyaannya?
Debosmit Ray
@mapeters: Ada a ArrayList. Saya memutar kembali hasil edit ke revisi pertama (sehingga Anda dapat melihatnya) dan meningkatkan format revisi pertama.
selama
Pertanyaannya adalah bagaimana mengkonversi string ke ArrayList, bukan bagaimana mengkonversi ArrayList ke Array.
Kamerad