Làm cách nào để chuyển đổi String được phân tách bằng dấu phẩy sang ArrayList?


538

Có phương thức dựng sẵn nào trong Java cho phép chúng ta chuyển đổi Chuỗi được phân tách bằng dấu phẩy sang một số vùng chứa (ví dụ: mảng, Danh sách hoặc Vector) không? Hay tôi cần phải viết mã tùy chỉnh cho điều đó?

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

Nếu bạn muốn phân tích CSV, hãy xem stackoverflow.com/questions/3908012/parsing-csv-in-java
Raedwald

@Raedwald Đó không phải là những gì OP yêu cầu mặc dù
Crowie

3
CHỈ Câu trả lời của ColinD là chính xác ở đây, giả sử bạn muốn có một ArrayList như trong tiêu đề câu hỏi. ArrayList (có thể thay đổi) hoàn toàn khác với List, có thể chỉ là một danh sách cố định đơn giản.
Fattie

@Fattie - điểm công bằng và đã sửa lỗi đó - stackoverflow.com/a/34735419/744133
YoYo

Câu trả lời:


1016

Chuyển đổi chuỗi được phân tách bằng dấu phẩy thành Danh sách

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

Đoạn mã trên phân tách chuỗi trên một dấu phân cách được xác định là: zero or more whitespace, a literal comma, zero or more whitespacesẽ đặt các từ vào danh sách và thu gọn bất kỳ khoảng trắng nào giữa các từ và dấu phẩy.


Xin lưu ý rằng điều này trả về đơn giản là một trình bao bọc trên một mảng: bạn KHÔNG THỂ ví dụ .remove()từ kết quả List. Đối với một thực tế, ArrayListbạn phải tiếp tục sử dụng new ArrayList<String>.


39
@rosch Đó là biểu thức chính quy (regex). \skhớp với bất kỳ khoảng trắng nào, Áp *dụng khớp 0 hoặc nhiều lần. Vì vậy, \s*có nghĩa là "khớp bất kỳ khoảng trắng nào từ 0 lần trở lên". Chúng tôi tìm kiếm điều này trước và sau dấu phẩy. Do đó, phần tách sẽ hoạt động cho các chuỗi như "item1 , item2 , item3", hoặc "item1,item2 ,item3", v.v. Trong Java, bạn cần thoát dấu gạch chéo ngược trong chuỗi, để bạn có được\\s*
andrewrjones

9
Tôi đề nghị sử dụng "[\\s,]+"để cắt khoảng trắng cho các giá trị. Ví dụ, " item1 , item2 , item3 , "trở thành ["item1", "item2", "item3"].
Andrii Nemchenko

5
"[\\s,]+"cũng sẽ phân tách trên không gian bên trong một mã thông báo được phân tách bằng dấu phẩy, nó sẽ coi cả hai khoảng trắng là dấu phân cách ngay cả khi không có dấu phẩy, thay vì dấu phẩy cộng với bất kỳ khoảng trắng nào xung quanh. "\\s*(,\\s*)+"sẽ chỉ cắt khoảng trắng xung quanh các mã thông báo được phân tách bằng dấu phẩy và cũng bỏ qua mọi chuỗi chỉ có khoảng trắng hoặc trống.
theferrit32

2
Như một lưu ý phụ: nếu bạn muốn có được một danh sách trống trong trường hợp chuỗi đầu vào trống, thì phương thức này không phù hợp với trường hợp sử dụng của bạn. Bạn sẽ nhận được một danh sách với 1 phần tử chứa một chuỗi rỗng.
Madis Pukkonen

3
@AlexR Mặc dù tôi đánh giá cao việc bạn tôn trọng OP, nhưng, tôi sẽ không nói những điều như vậy. Tôi biết những người cảm thấy tồi tệ vì không đáp ứng được kỳ vọng của mọi người khi được khen ngợi một cách sai lệch. Chỉ là một ý nghĩ.

199

Arrays.asListtrả về một kích thước cố định được Listhỗ trợ bởi mảng. Nếu bạn muốn một đột biến bình thường, java.util.ArrayListbạn cần phải làm điều này:

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

Hoặc, sử dụng ổi :

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

Sử dụng một Splittercung cấp cho bạn linh hoạt hơn trong cách bạn phân tách chuỗi và cung cấp cho bạn khả năng, ví dụ, bỏ qua các chuỗi trống trong kết quả và cắt kết quả. Nó cũng có hành vi ít kỳ lạ hơn String.splitcũng như không yêu cầu bạn phải phân chia theo regex (đó chỉ là một lựa chọn).


6
Sẽ thích Splitter.on (","). TrimResults (). Split (chuỗi) mặc dù tôi thấy bạn đã đề cập đến nó. vì vậy +1
John B

10
+1 để chỉ ra rằng Arrays.asList không trả về danh sách bình thường. Nếu bạn cố gắng thêm hoặc xóa một thành phần vào / từ Danh sách đó, bạn sẽ nhận được UnsupportedOperationException.
Alfredo Osorio

9
Guava hiện có cái này kể từ (15.0): Splitter.on (","). SplitToList (chuỗi) . Tiết kiệm một bước nhỏ.
Kango_V

Có cách nào để thêm các giá trị trống trong Chuỗi iike không nếu Chuỗi của tôi như thế này: 1, 3,4,5 ở đây 2 bị thiếu / trống. Khi chuyển đổi trong danh sách 2 sẽ bỏ qua. Nhưng tôi muốn thêm giá trị này vào giá trị trống.
A.Aleem11

Vấn đề với việc triển khai này và một số ví dụ tương tự khác là mặc dù trình Arrays.asListcung cấp trình bao bọc xung quanh mảng gốc (tránh sao chép phần tử), new ArrayList(...)chính xác sẽ thực hiện một phần tử như vậy bằng bản sao phần tử. Có lẽ chúng ta nên thích một cách tiếp cận cho phép các phần tử được phân tích cú pháp được thêm trực tiếp vào bộ sưu tập mục tiêu mong muốn.
YoYo

70

Hai bước:

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

1
Khi bạn nội tuyến biến mục, về cơ bản nó giống như các câu trả lời khác, nhưng thực tế hiệu quả hơn một chút vì nó không sử dụng regex. Mặt khác, không gian xung quanh dấu phẩy sẽ giết tùy chọn này.
Amrinder Arora

2
@AmrinderArora đối số splitđược hiểu là RegEx.
Madbreaks

23

Đây là một cái khác để chuyển đổi CSV sang 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));
}

In cho bạn

-> chuỗi
-> với
-> dấu phẩy


21

Nếu a Listlà mục tiêu cuối cùng như OP đã nêu, thì câu trả lời đã được chấp nhận vẫn là câu trả lời ngắn nhất và tốt nhất. Tuy nhiên tôi muốn cung cấp các lựa chọn thay thế bằng cách sử dụng Luồng Java 8 , điều đó sẽ mang lại cho bạn nhiều lợi ích hơn nếu đó là một phần của đường ống để xử lý thêm.

Bằng cách gói kết quả của hàm .split (một mảng gốc) vào một luồng và sau đó chuyển đổi thành một danh sách.

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

Nếu điều quan trọng là kết quả được lưu trữ theo ArrayListtiêu đề từ OP, bạn có thể sử dụng một Collectorphương pháp khác :

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

Hoặc bằng cách sử dụng api phân tích cú pháp RegEx:

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

Lưu ý rằng bạn vẫn có thể xem xét để lại listbiến được nhập List<String>thay vì ArrayList<String>. Giao diện chung cho Listvẫn có vẻ tương tự đủ để ArrayListthực hiện.

Tự thân, các ví dụ mã này dường như không thêm nhiều (ngoại trừ việc nhập nhiều hơn), nhưng nếu bạn dự định làm nhiều hơn, như câu trả lời này về việc chuyển đổi Chuỗi thành Danh sách dài , ví dụ, API phát trực tuyến thực sự mạnh mẽ bằng cách cho phép để đường ống hoạt động của bạn từng cái một.

Vì lợi ích của bạn, bạn biết đấy, sự đầy đủ.


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

1
Một trong những câu trả lời tốt nhất bây giờ. Danh sách có thể được thay đổi trong câu trả lời +1 này.
Sedrick

hoạt động sau khi đổi collect(toList())thànhcollect(Collectors.toList()
Sundararaj Govindasamy

Trong thực tế, collect(toList())đang sử dụng nhập khẩu tĩnh Collectors.toList()cho ngắn gọn và trôi chảy :)
Manu

15

Không có phương thức dựng sẵn cho việc này nhưng bạn chỉ có thể sử dụng phương thức split () trong việc này.

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

14
List<String> items = Arrays.asList(commaSeparated.split(","));

Điều đó sẽ làm việc cho bạn.


10

bạn có thể kết hợp asList và split

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

8

Mã này sẽ giúp,

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

5

Bạn có thể sử dụng Guava để tách chuỗi và chuyển đổi nó thành ArrayList. Điều này cũng hoạt động với một chuỗi trống và trả về một danh sách trống.

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

xuất ra như sau:

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

4

Một ví dụ sử dụng Collections.

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

1
Bạn đã tránh Arrays.asList trung gian. Thật không may, chúng tôi vẫn có một bản sao từ các phần tử mảng vào bộ sưu tập. Đẹp thay thế để nhớ.
YoYo

4

Có nhiều cách để giải quyết vấn đề này bằng cách sử dụng các luồng trong Java 8 nhưng IMO, một lớp lót sau đây được chuyển thẳng:

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

Có ai biết làm thế nào tôi có thể chuyển đổi Chuỗi này thành danh sách được phân tách bằng dấu phẩy --String s = "2017-07-12 23: 40: 00.0,153.76,16.140,60.00, 56.00,"; Danh sách <String> splitedString = new ArrayList <String> (Arrays.asList (s.split ("\\ s *, \\ s *")));
Nắng

1
Đây là một câu hỏi mới, đừng hỏi nó như một bình luận. Hãy tạo ra một câu hỏi mới.
George Siggouroglou

2

Trước tiên, bạn có thể phân tách chúng bằng cách sử dụng String.split(","), sau đó chuyển đổi Chuỗi trả về arraythành ArrayListsử dụngArrays.asList(array)


2

Trong Groovy, bạn có thể sử dụng phương thức mã thông báo (Mã thông báo ký tự):

list = str.tokenize(',')

Cái này đã cứu tôi! Cảm ơn bạn.
tamerlaha

2

Kết quả tương tự bạn có thể đạt được bằng cách sử dụng lớp Splitter.

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

(viết bằng kotlin)


1
Các tài liệu nói rằng chức năng này là beta và không ổn định.
Rubberducker

1
List commaseperated = new ArrayList();
String mylist = "item1 , item2 , item3";
mylist = Arrays.asList(myStr.trim().split(" , "));

// enter code here

1

Tôi thường sử dụng mẫu được biên dịch trước cho danh sách. Và điều này cũng phổ biến hơn một chút vì nó có thể xem xét các dấu ngoặc theo một số biểu thức 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

Trong Kotlin nếu danh sách Chuỗi của bạn như thế này và bạn có thể sử dụng để chuyển đổi chuỗi thành ArrayList, hãy sử dụng dòng mã này

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


0

Bạn có thể làm như sau.

Điều này loại bỏ khoảng trắng và phân chia bằng dấu phẩy, nơi bạn không cần phải lo lắng về khoảng trắng.

    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

Chuỗi -> Chuyển đổi bộ sưu tập : (Chuỗi -> Chuỗi [] -> Bộ sưu tập)

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

Bộ sưu tập -> Chuỗi [] chuyển đổi:

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

Chuyển đổi chuỗi -> Chuỗi [] :

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

Bộ sưu tập -> Bộ sưu tập :

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

-2

chuyển đổi Bộ sưu tập thành chuỗi dưới dạng dấu phẩy được phân tách trong Java 8

đối tượng listOfString chứa các phần tử ["A", "B", "C", "D"]

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

Đầu ra là: - 'A', 'B', 'C', 'D'

Và chuyển đổi chuỗi Array thành danh sách trong 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
Và chính xác là ở ArrayListđâu? Bạn thậm chí đã đọc câu hỏi?
Ghi nợ Ray

@mapeter: Đã có một ArrayList. Tôi đã khôi phục các chỉnh sửa cho lần sửa đổi đầu tiên (để bạn có thể thấy nó) và cải thiện định dạng của phiên bản đầu tiên.
Dur

Câu hỏi là làm thế nào để chuyển đổi chuỗi thành ArrayList chứ không phải làm thế nào để chuyển đổi ArrayList thành Array.
đồng chí
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.