จะแปลง String เป็น ArrayList ได้อย่างไร?


101

ในสตริงของฉันฉันสามารถมีจำนวนคำตามอำเภอใจซึ่งคั่นด้วยจุลภาค ฉันต้องการให้แต่ละคำเพิ่มเข้าไปใน ArrayList เช่น:

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

คำตอบ:


254

ลองสิ่งที่ชอบ

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

การสาธิต:

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]

โพสต์นี้ได้รับการเขียนใหม่เป็นบทความที่นี่


9
+1: new ArrayList<String>()อาจซ้ำซ้อนขึ้นอยู่กับวิธีการใช้งาน (ตามตัวอย่างของคุณ)
Peter Lawrey

1
ฮิฮิใช่ +1 :-) จริงๆแล้วมันอาจจะเป็นsplitของเขาก็ได้: P
aioobe

เขาคงต้องใช้Arrays.toString()พิมพ์ แต่ใช่
Peter Lawrey

ArrayList <String> () ใหม่ทำให้รายการใหม่ถูกสร้างขึ้นโดยมีรายการที่ส่งคืนอยู่ภายใน Arrays.asList (a) ส่งคืนวัตถุ List ดังนั้นอย่าเรียก ArrayList ใหม่คุณจะได้รับพฤติกรรมที่ไม่ต้องการ
Clocker

6
โปรดทราบว่าคุณไม่สามารถเพิ่มองค์ประกอบในรายการที่ส่งคืนโดย Arrays.asList OP ต้องการให้มี ArrayList (ซึ่งมีความสมเหตุสมผลอย่างสมบูรณ์) และจำเป็นต้องมีการสร้าง ArrayList
aioobe

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

10
หากคุณต้องตัดแต่งวงเล็บคุณสามารถทำได้ในขั้นตอนเดียวด้วยreplace = s1.replaceAll("^\\[|]$", "");
David Ehrmann

ฉันใช้คำตอบนี้ แต่บางครั้งผู้ใช้ของฉันใช้","และอื่น ๆ", "เป็นตัวคั่นดังนั้นฉันจึงเพิ่มฟังก์ชัน.replaceAll(", ", ",")before split
IgniteCoders

9

ตัวเลือกที่ 1 :

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

ตัวเลือกที่ 2 :

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

ในความคิดของฉัน Option1 ดีกว่าเพราะ

  1. เราสามารถลดจำนวนวัตถุ ArrayList ที่สร้างขึ้นจาก 2 เป็น 1 asListวิธีการสร้างและส่งคืนวัตถุ ArrayList
  2. ประสิทธิภาพดีกว่ามาก (แต่ส่งกลับรายการขนาดคงที่)

โปรดดูเอกสารประกอบที่นี่


เหตุใดจึงไม่ได้ผล List<Character> word1 = new ArrayList<Character>(Arrays.asList(A[0].toCharArray()));ฉันพยายามรับสตริงแรกของอาร์เรย์สตริงและแปลงสตริงนั้นเป็น charArray และ charArray เป็น List <Character>
sofs1

นั่นเป็นเพราะเมธอด asList ในคลาส Arrays ใช้เฉพาะ Object array ไม่ใช่ primitive arrays หากคุณแปลงอาร์เรย์ char [] เป็น Character [] ก็จะใช้ได้
Andy

ตัวละครคงที่สาธารณะ [] boxToCharacter (ถ่าน [] charArray) {ตัวละคร [] newArray = ตัวละครใหม่ [charArray.length]; int ผม = 0; สำหรับ (ค่าถ่าน: charArray) {newArray [i ++] = Character.valueOf (value); } กลับ newArray; }
แอนดี้

8

ใน Java 9 การใช้List#ofซึ่งเป็นวิธีการโรงงานแบบคงที่ไม่เปลี่ยนรูปแบบรายการจะง่ายขึ้น

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

s.split("\\s*,\\s*")สามารถเพิ่มเพื่อการดูแลเป็นพิเศษ
Vishwajit R. Shinde

3

ตกลงฉันจะขยายในคำตอบที่นี่ตั้งแต่ผู้คนจำนวนมากที่มาที่นี่ต้องการที่จะแยกสตริงโดยช่องว่าง นี่คือวิธีการ:

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

2

หากคุณกำลังนำเข้าหรือคุณมีอาร์เรย์ (ประเภทสตริง) ในโค้ดของคุณและคุณต้องแปลงเป็นอาร์เรย์ (สตริงนอกหลักสูตร) ​​การใช้คอลเลกชันจะดีกว่า แบบนี้:

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

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

2

คุณสามารถใช้:

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

คุณควรถามตัวเองว่าคุณต้องการ ArrayList ตั้งแต่แรกหรือไม่ บ่อยครั้งที่คุณจะกรองรายการตามเกณฑ์เพิ่มเติมซึ่งสตรีมจะสมบูรณ์แบบ คุณอาจต้องการชุด; คุณอาจต้องการกรองโดยใช้นิพจน์ทั่วไปอื่น ๆ เป็นต้น Java 8 มีส่วนขยายที่มีประโยชน์นี้ซึ่งจะใช้งานได้กับCharSequence: https://docs.oracle.com/javase/8/docs/api /java/util/regex/Pattern.html#splitAsStream-java.lang.CharSequence- เนื่องจากคุณไม่ต้องการอาร์เรย์เลยให้หลีกเลี่ยงการสร้างอาร์เรย์ดังนี้:

// 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

หากคุณต้องการแปลงสตริงเป็นArrayListลองสิ่งนี้:

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

แต่ฉันเห็นสตริงอาร์เรย์ในตัวอย่างของคุณดังนั้นหากคุณต้องการแปลงสตริงอาร์เรย์เป็นArrayList ให้ใช้สิ่งนี้:

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

วิธีการที่ง่ายกว่าคือ ArrayList <String> myList = new ArrayList <String> (); สำหรับ (ตัวละคร c: s.toCharArray ()) {myList.add (c.toString ()); } แต่ฉันไม่คิดว่านี่คือสิ่งที่คน ๆ นั้นกำลังมองหา การแก้ปัญหาโดย aioobe คือสิ่งที่จำเป็น ไชโย
สตีฟ


1

นี่คือการใช้ Gson ใน 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

ลองถามคำถาม: ย้อนกลับสตริง ฉันจะทำโดยใช้สตรีม () รวบรวม () แต่ก่อนอื่นฉันจะเปลี่ยนสตริงเป็น 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
ดังนั้น ... คุณกำลังใช้วิธีแก้ปัญหาที่ยอมรับเพื่อสร้างตัวอย่างเกี่ยวกับปัญหาอื่นหรือไม่? ทำไม?
Francesco B.

0

ฉันขอแนะนำให้ใช้ StringTokenizer มีประสิทธิภาพมาก

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.