Làm thế nào để tách một chuỗi được phân tách bằng dấu phẩy?


202

Tôi có một Chuỗi có độ dài không xác định trông giống như thế này

"dog, cat, bear, elephant, ..., giraffe"

Điều gì sẽ là cách tối ưu để phân chia chuỗi này tại dấu phẩy để mỗi từ có thể trở thành một thành phần của ArrayList?

Ví dụ

List<String> strings = new ArrayList<Strings>();
// Add the data here so strings.get(0) would be equal to "dog",
// strings.get(1) would be equal to "cat" and so forth.

1
sử dụng phương thức split ("split char"), nó chia tách phương thức nad chuỗi của bạn sẽ tạo ra chuỗi chuỗi với các từ được chia.
Simon Dorociak

Câu trả lời:


343

Bạn có thể làm điều này:

String str = "...";
List<String> elephantList = Arrays.asList(str.split(","));

Về cơ bản .split()phương thức sẽ phân tách chuỗi theo dấu phân cách (trong trường hợp này) mà bạn đang truyền và sẽ trả về một chuỗi các chuỗi.

Tuy nhiên, bạn dường như theo sau một Danh sách các chuỗi chứ không phải là một mảng, vì vậy mảng phải được biến thành một danh sách bằng cách sử dụng Arrays.asList()tiện ích. Giống như một FYI, bạn cũng có thể làm một cái gì đó như vậy:

String str = "...";
ArrayList<String> elephantList = new ArrayList<>(Arrays.asList(str.split(","));

Nhưng thông thường tốt hơn là lập trình lên một giao diện thay vì triển khai cụ thể thực tế, vì vậy tôi khuyên bạn nên sử dụng tùy chọn thứ nhất.


9
Hãy ghi nhớ điều này sẽ không cắt bớt các giá trị để chuỗi.get (1) sẽ là "mèo" chứ không phải "mèo"
Alb

45
str.splitchấp nhận regex để bạn có thể sử dụng str.split(",[ ]*");để bạn xóa dấu phẩy và dấu cách sau dấu phẩy.
vertti

4
Tệp được phân cách bằng dấu phẩy (csv) có thể có dấu phẩy trong dấu ngoặc kép, nghĩa là nó không phải là dấu phân cách. Trong trường hợp này, Split sẽ không hoạt động.
Steven Trigg

2
Tùy chọn thứ hai yêu cầu như đúc ArrayList<String>.
C_B

3
Nếu bạn cần giữ các mục trống (ví dụ: đối với độ dài mảng nhất quán), hãy sử dụng split (",", - 1) theo stackoverflow.com/questions/14602062/
Lỗi

157

Vâng, bạn muốn chia tay , phải không?

String animals = "dog, cat, bear, elephant, giraffe";

String[] animalsArray = animals.split(",");

Nếu bạn muốn loại bỏ khoảng trắng xung quanh các mục:

String[] animalsArray = animals.split("\\s*,\\s*");

Vâng, đó là một phần của giải pháp. OP dường như nằm sau Danh sách các chuỗi, không phải là một mảng.
npinti

@npinti: vâng, +1 cho bạn, bạn đã nhanh hơn và tôi không muốn sao chép Arrays.asList()thành ngữ của bạn .
Tomasz Nurkiewicz

1
Tôi cứ suy nghĩ trong 10 giờ, rồi tìm kiếm SO. không biết rằng nó rất dễ để .split ();
DeathRs

Điều gì sẽ xảy ra nếu bạn muốn lưu trữ các mục được phân chia kết quả trong một tập hợp thay vì trong một mảng?
Moses Kiredit

29

Bạn có thể tách nó và tạo một mảng sau đó truy cập như mảng

String names = "prappo,prince";
String[] namesList = names.split(",");

bạn có thể truy cập như

String name1 = namesList [0];
String name2 = namesList [1];

hoặc sử dụng vòng lặp

for(String name : namesList){
System.out.println(name);
}

hy vọng nó sẽ giúp bạn


18

Một cải tiến nhỏ: các giải pháp trên sẽ không xóa các khoảng trắng ở đầu hoặc cuối trong Chuỗi thực. Tốt hơn là gọi trim trước khi gọi chia. Thay vì điều này,

 String[] animalsArray = animals.split("\\s*,\\s*");

sử dụng

 String[] animalsArray = animals.trim().split("\\s*,\\s*");

1
đối với dòng thứ hai của bạn, nếu chúng ta sử dụng trim () thì chúng ta không cần phân chia không gian như ("\\s*,\\s*")chỉ sử dụng (",");điều này sẽ cho kết quả tương tự.
WIZARD

5
Tôi không chắc chắn về điều đó @WIZARD vì trim chỉ loại bỏ không gian bên trái và bên phải của chuỗi, chứ không phải khoảng trống trong đó. Vì vậy, trim(" string, with , space ")sẽ được "string, with , space".
Thomas Leduc

@ThomasLeduc nếu chuỗi là như thế này "dog, cat, bear, elephant, giraffe"thì không cần trim()và trong trường hợp của bạn nếu sử dụng trim()thì đặt ra sẽ "string,with,space"không phải thế này"string, with , space"
WIZARD

trim()sẽ xóa tất cả các khoảng trắng không chỉ không gian bên trái và bên phải của chuỗi
WIZARD

5
Bạn có kiểm tra nó không? bởi vì tôi vừa viết một chương trình java và chuỗi " string, with , space ".trim()trả về "string, with , space". Giống như javadoc nói: trả về một bản sao của chuỗi, với khoảng trắng ở đầu và cuối được bỏ qua. Bạn đã sai và @ user872858 đúng.
Thomas Leduc

3

Đầu tiên bạn có thể chia tên như thế này

String animals = "dog, cat, bear, elephant,giraffe";

String animals_list[] = animals.split(",");

để truy cập động vật của bạn

String animal1 = animals_list[0];
String animal2 = animals_list[1];
String animal3 = animals_list[2];
String animal4 = animals_list[3];

Và bạn cũng muốn xóa khoảng trắng và dấu phẩy xung quanh tên động vật

String animals_list[] = animals.split("\\s*,\\s*");

3

Để hoàn thiện, sử dụng thư viện Guava , bạn sẽ làm: Splitter.on(",").split(“dog,cat,fox”)

Một vi dụ khac:

String animals = "dog,cat, bear,elephant , giraffe ,  zebra  ,walrus";
List<String> l = Lists.newArrayList(Splitter.on(",").trimResults().split(animals));
// -> [dog, cat, bear, elephant, giraffe, zebra, walrus]

Splitter.split()trả về một Iterable, vì vậy nếu bạn cần một Danh sách, hãy bọc nó Lists.newArrayList()như trên. Mặt khác, chỉ cần đi với Iterable, ví dụ:

for (String animal : Splitter.on(",").trimResults().split(animals)) {
    // ...
}

Lưu ý cách trimResults()xử lý tất cả các nhu cầu cắt xén của bạn mà không phải điều chỉnh regexes cho các trường hợp góc , như với String.split().

Nếu dự án của bạn đã sử dụng Guava, đây sẽ là giải pháp ưa thích của bạn. Xem tài liệu Splitter trong Hướng dẫn sử dụng Guava hoặc javadocs để biết thêm các tùy chọn cấu hình.


2

Có thể thử với điều này làm việc cho tôi

 sg = sg.replaceAll(", $", "");

hoặc cái gì đó khác

if (sg.endsWith(",")) {
                    sg = sg.substring(0, sg.length() - 1);
                }

1

trong build.gradle thêm Guava

    compile group: 'com.google.guava', name: 'guava', version: '27.0-jre'

và sau đó

    public static List<String> splitByComma(String str) {
    Iterable<String> split = Splitter.on(",")
            .omitEmptyStrings()
            .trimResults()
            .split(str);
    return Lists.newArrayList(split);
    }

    public static String joinWithComma(Set<String> words) {
        return Joiner.on(", ").skipNulls().join(words);
    }

thưởng thức :)


0

Xóa tất cả các khoảng trắng và tạo Danh sách có kích thước cố định hoặc không thay đổi (Xem asList tài liệu API )

final String str = "dog, cat, bear, elephant, ..., giraffe";
List<String> list = Arrays.asList(str.replaceAll("\\s", "").split(","));
// result: [dog, cat, bear, elephant, ..., giraffe]

Cũng có thể sử dụng replaceAll(\\s+", "")nhưng hiệu quả tối đa phụ thuộc vào trường hợp sử dụng. (xem câu trả lời @GurselKoca để xóa khoảng trắng khỏi chuỗi trong Java )


0

Bạn có thể sử dụng một cái gì đó như thế này:

String animals = "dog, cat, bear, elephant, giraffe";

List<String> animalList = Arrays.asList(animals.split(","));

Ngoài ra, bạn bao gồm các lib:

import java.util.ArrayList;
import java.util.Arrays; 
import java.util.List;


0

Trong Kotlin,

val stringArray = commasString.replace(", ", ",").split(",")

nơi stringArrayList<String>commasStringStringbằng dấu phẩy và không gian


0

Đây là một cách dễ dàng để phân tách chuỗi bằng dấu phẩy,

import java.util.*;

public class SeparatedByComma{
public static void main(String []args){
     String listOfStates = "Hasalak, Mahiyanganaya, Dambarawa, Colombo";
     List<String> stateList = Arrays.asList(listOfStates.split("\\,"));
     System.out.println(stateList);
 }
}

Mã này tôi đã sử dụng cho JDK. Và nếu bạn cần in mảng. sử dụng System.out.println
Sandun Susantha

-1

Có một chức năng được gọi là replaceAll()có thể loại bỏ tất cả các khoảng trắng bằng cách thay thế chúng bằng bất cứ thứ gì bạn muốn. Làm ví dụ

String str="  15. 9 4;16.0 1"
String firstAndSecond[]=str.replaceAll("\\s","").split(";");
System.out.println("First:"+firstAndSecond[0]+", Second:"+firstAndSecond[1]);

sẽ cung cấp cho bạn:

First:15.94, Second:16.01
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.