Làm thế nào để chuyển đổi một chuỗi thành một ArrayList?


101

Trong Chuỗi của tôi, tôi có thể có một số từ tùy ý được phân tách bằng dấu phẩy. Tôi muốn từng từ được thêm vào ArrayList. Ví dụ:

String s = "a,b,c,d,e,.........";

Câu trả lời:


251

Hãy thử một cái gì đó như

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

Bản giới thiệu:

String s = "lorem,ipsum,dolor,sit,amet";

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

System.out.println(myList);  // prints [lorem, ipsum, dolor, sit, amet]

Bài đăng này đã được viết lại thành một bài báo ở đây .


9
+1: Có new ArrayList<String>()thể thừa tùy thuộc vào cách nó được sử dụng. (như trong ví dụ của bạn;)
Peter Lawrey

1
Hehe, yeah, 1 :-) Nó có thể thực sự thậm chí chỉ là splitsau khi mình: P
aioobe

Anh ấy sẽ phải sử dụng Arrays.toString()để in nó, nhưng có.
Peter Lawrey

ArrayList mới <String> () tạo ra một danh sách mới với danh sách trả về bên trong nó. Arrays.asList (a) trả về một đối tượng List do đó không gọi ArrayList mới, bạn sẽ nhận được hành vi không mong muốn.
clocker

6
Lưu ý rằng bạn không thể thêm các phần tử vào danh sách do Arrays.asList trả về. OP muốn có ArrayList (điều này hoàn toàn hợp lý) và việc xây dựng ArrayList cần thiết.
aioobe

32
 String s1="[a,b,c,d]";
 String replace = s1.replace("[","");
 System.out.println(replace);
 String replace1 = replace.replace("]","");
 System.out.println(replace1);
 List<String> myList = new ArrayList<String>(Arrays.asList(replace1.split(",")));
 System.out.println(myList.toString());

8
Nếu bạn phải khung trang trí, bạn có thể làm điều đó chỉ trong một bước vớireplace = s1.replaceAll("^\\[|]$", "");
David Ehrmann

9

Lựa chọn 1 :

List<String> list = Arrays.asList("hello");

Tùy chọn 2 :

List<String> list = new ArrayList<String>(Arrays.asList("hello"));

Theo tôi, Lựa chọn 1 tốt hơn vì

  1. chúng ta có thể giảm số lượng đối tượng ArrayList được tạo từ 2 xuống 1. asListPhương thức tạo và trả về một đối tượng ArrayList.
  2. hiệu suất của nó tốt hơn nhiều (nhưng nó trả về một danh sách có kích thước cố định).

Vui lòng tham khảo tài liệu tại đây


Tại sao không làm việc này List<Character> word1 = new ArrayList<Character>(Arrays.asList(A[0].toCharArray()));tôi đang cố gắng để có được chuỗi đầu tiên của một mảng chuỗi, và chuyển đổi chuỗi thành charArray và charArray vào danh sách <Character>
sofs1

đó là bởi vì, phương thức asList trong lớp Mảng chỉ nhận mảng Đối tượng, không phải mảng nguyên thủy. Nếu bạn chuyển đổi mảng char [] thành Character [], nó sẽ hoạt động.
Andy

public static Character [] boxToCharacter (char [] charArray) {Character [] newArray = new Character [charArray.length]; int i = 0; for (giá trị char: charArray) {newArray [i ++] = Character.valueOf (giá trị); } trả về newArray; }
Andy

8

Trong Java 9, việc sử dụng List#of, là Phương thức nhà máy sản xuất tĩnh trong danh sách bất biến, trở nên đơn giản hơn.

 String s = "a,b,c,d,e,.........";
 List<String> lst = List.of(s.split(","));

s.split("\\s*,\\s*")có thể được thêm vào để chăm sóc thêm
Vishwajit R. Shinde

2

Nếu bạn đang nhập hoặc bạn có một mảng (kiểu chuỗi) trong mã của mình và bạn phải chuyển đổi nó thành danh sách mảng (chuỗi ngoại ngữ) thì việc sử dụng các bộ sưu tập sẽ tốt hơn. như thế này:

String array1[] = getIntent().getExtras().getStringArray("key1"); or String array1[] = ... then

List allEds = new ArrayList(); Collections.addAll(allEds, array1);

2

Được rồi, tôi sẽ mở rộng các câu trả lời ở đây vì rất nhiều người đến đây muốn chia chuỗi bằng một khoảng trắng . Đây là cách mà nó được hoàn thành:

List<String> List = new ArrayList<String>(Arrays.asList(s.split("\\s+")));

2

Bạn đã có thể sử dụng:

List<String> tokens = Arrays.stream(s.split("\\s+")).collect(Collectors.toList());

Bạn nên tự hỏi mình nếu bạn thực sự cần ArrayList ngay từ đầu. Thông thường, bạn sẽ lọc danh sách dựa trên các tiêu chí bổ sung, theo đó một Luồng là hoàn hảo. Bạn có thể muốn một bộ; bạn có thể muốn lọc chúng bằng một biểu thức chính quy khác, v.v. Java 8 cung cấp tiện ích mở rộng rất hữu ích này, nhân tiện, sẽ hoạt động trên bất kỳ CharSequence: https://docs.oracle.com/javase/8/docs/api /java/util/regex/Pattern.html#splitAsStream-java.lang.CharSequence- . Vì bạn không cần mảng, hãy tránh tạo nó như vậy:

// This will presumably be a static final field somewhere.
Pattern splitter = Pattern.compile("\\s+");
// ...
String untokenized = reader.readLine();
Stream<String> tokens = splitter.splitAsStream(untokenized);

1

Nếu bạn muốn chuyển đổi một chuỗi thành ArrayList, hãy thử cách này:

public ArrayList<Character> convertStringToArraylist(String str) {
    ArrayList<Character> charList = new ArrayList<Character>();      
    for(int i = 0; i<str.length();i++){
        charList.add(str.charAt(i));
    }
    return charList;
}

Nhưng tôi thấy một mảng chuỗi trong ví dụ của bạn, vì vậy nếu bạn muốn chuyển đổi một mảng chuỗi thành ArrayList, hãy sử dụng cái này:

public static ArrayList<String> convertStringArrayToArraylist(String[] strArr){
    ArrayList<String> stringList = new ArrayList<String>();
    for (String s : strArr) {
        stringList.add(s);
    }
    return stringList;
}

Một cách tiếp cận dựa trên ký tự đơn giản hơn sẽ là: ArrayList <String> myList = new ArrayList <String> (); for (Ký tự c: s.toCharArray ()) {myList.add (c.toString ()); } Nhưng tôi không nghĩ đây là thứ mà người đó đang tìm kiếm. Giải pháp của aioobe là những gì được yêu cầu. chúc mừng
Steve

1

Dễ hiểu hơn là như sau:

String s = "a,b,c,d,e";
String[] sArr = s.split(",");
List<String> sList = Arrays.asList(sArr);

1

Điều này đang sử dụng Gson trong Kotlin

 val listString = "[uno,dos,tres,cuatro,cinco]"
 val gson = Gson()
 val lista = gson.fromJson(listString , Array<String>::class.java).toList()
 Log.e("GSON", lista[0])

0

Hãy đặt một câu hỏi: Đảo ngược một chuỗi. Tôi sẽ làm điều này bằng cách sử dụng stream (). Collect (). Nhưng trước tiên tôi sẽ thay đổi chuỗi thành một ArrayList.

    public class StringReverse1 {
    public static void main(String[] args) {

        String a = "Gini Gina  Proti";

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

        list.stream()
        .collect(Collectors.toCollection( LinkedList :: new ))
        .descendingIterator()
        .forEachRemaining(System.out::println);



    }}
/*
The output :
i
t
o
r
P


a
n
i
G

i
n
i
G
*/

1
vì vậy ... bạn đang sử dụng giải pháp được chấp nhận để làm ví dụ về một vấn đề khác? tại sao?
Francesco B.

0

Tôi khuyên bạn nên sử dụng StringTokenizer, rất hiệu quả

     List<String> list = new ArrayList<>();

     StringTokenizer token = new StringTokenizer(value, LIST_SEPARATOR);
     while (token.hasMoreTokens()) {
           list.add(token.nextToken());
     }

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.