วิธีการแปลงสตริงที่คั่นด้วยเครื่องหมายจุลภาคเป็น ArrayList?


538

มีวิธีการในตัวใน Java ซึ่งช่วยให้เราสามารถแปลงสตริงที่คั่นด้วยเครื่องหมายจุลภาคเพื่อภาชนะบางอย่าง (เช่นอาร์เรย์รายการหรือเวกเตอร์)? หรือฉันจำเป็นต้องเขียนรหัสที่กำหนดเองสำหรับสิ่งนั้น?

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

หากคุณต้องการแยกวิเคราะห์ CSV ดูstackoverflow.com/questions/3908012/parsing-csv-in-java
Raedwald

@ Raedwald นั่นไม่ใช่สิ่งที่ OP ขอมาแม้ว่า
Crowie

3
คำตอบของ ColinD เท่านั้นที่ถูกต้องที่นี่โดยสมมติว่าคุณต้องการ ArrayList เหมือนในชื่อคำถาม ArrayList (ซึ่งไม่แน่นอน) แตกต่างจากรายการอย่างสิ้นเชิงซึ่งอาจเป็นเพียงรายการที่เรียบง่าย
Fattie

@Fattie - จุดยุติธรรมและแก้ไข - stackoverflow.com/a/34735419/744133
YoYo

1
โซลูชัน Java 8: stackoverflow.com/a/46485179/1216775
akhil_mittal

คำตอบ:


1016

แปลงสตริงที่คั่นด้วยเครื่องหมายจุลภาคเป็นรายการ

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

โค้ดด้านบนจะแยกสตริงบนตัวคั่นที่กำหนดเป็น: zero or more whitespace, a literal comma, zero or more whitespaceซึ่งจะวางคำลงในรายการและยุบช่องว่างใด ๆ ระหว่างคำและเครื่องหมายจุลภาค


โปรดทราบว่าผลตอบแทนที่ได้นี้เป็นเพียงเสื้อคลุมบนอาร์เรย์: คุณCAN NOTเช่นจากที่เกิด.remove() Listสำหรับที่เกิดขึ้นจริงคุณต้องต่อการใช้งานArrayListnew ArrayList<String>


39
@rosch มันเป็นนิพจน์ปกติ (regex) \sตรงกับพื้นที่สีขาวใด ๆ*ใช้การแข่งขันศูนย์หรือมากกว่าครั้ง ดังนั้น\s*หมายถึง "จับคู่พื้นที่สีขาวเป็นศูนย์หรือมากกว่านั้น" เรามองหาสิ่งนี้ก่อนและหลังเครื่องหมายจุลภาค ดังนั้นการแยกจะทำงานกับสตริงเช่น"item1 , item2 , item3"หรือ"item1,item2 ,item3"อื่น ๆ ใน Java คุณจะต้องหลีกเลี่ยงแบ็กสแลชในสตริงดังนั้นคุณจะได้รับ\\s*
andrewrjones

9
ฉันแนะนำให้ใช้"[\\s,]+"เพื่อตัดช่องว่างสีขาวสำหรับค่า ยกตัวอย่างเช่นจะกลายเป็น" item1 , item2 , item3 , " ["item1", "item2", "item3"]
Andrii Nemchenko

5
"[\\s,]+"จะแยกพื้นที่ภายในภายในโทเค็นที่คั่นด้วยเครื่องหมายจุลภาคโดยจะถือว่าทั้งช่องว่างเป็นตัวคั่นแม้ว่าจะไม่มีเครื่องหมายจุลภาคแทนที่เครื่องหมายจุลภาคและช่องว่างโดยรอบจำนวนเท่าใดก็ตาม "\\s*(,\\s*)+"จะตัดช่องว่างรอบ ๆ โทเค็นที่คั่นด้วยเครื่องหมายจุลภาคเท่านั้นและจะละเว้นสตริงใด ๆ ที่เป็นช่องว่างหรือว่างเปล่าเท่านั้น
theferrit32

2
ตามหมายเหตุด้านข้าง: หากคุณคาดว่าจะได้รับรายการที่ว่างเปล่าในกรณีที่มีสตริงการป้อนข้อมูลที่ว่างเปล่าวิธีการนี้จะไม่เหมาะกับกรณีการใช้งานของคุณ คุณจะได้รับรายการที่มี 1 องค์ประกอบที่มีสตริงว่าง
Madis Pukkonen

3
@AlexR แม้ว่าฉันจะขอบคุณที่คุณเคารพ OP แต่ฉันจะละเว้นจากการพูดสิ่งต่าง ๆ ฉันรู้ว่าคนที่รู้สึกไม่ดีไม่ตอบสนองความคาดหวังของผู้คนเมื่อได้รับการยกย่องอย่างเท็จ แค่ความคิด

199

Arrays.asListส่งกลับขนาดคงที่Listได้รับการสนับสนุนโดยอาร์เรย์ หากคุณต้องการความไม่แน่นอนปกติjava.util.ArrayListคุณต้องทำสิ่งนี้:

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

หรือใช้Guava :

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

การใช้ a Splitterจะช่วยให้คุณมีความยืดหยุ่นมากขึ้นในการแยกสตริงและให้ความสามารถในการข้ามสตริงว่างในผลลัพธ์และตัดแต่งผลลัพธ์ นอกจากนี้ยังมีพฤติกรรมแปลก ๆ น้อยกว่าString.splitและไม่ต้องการให้คุณแยกโดย regex (นั่นเป็นเพียงตัวเลือกเดียว)


6
จะมีSplitter.on (",") ที่ต้องการ trimResults (). split (string)แม้ว่าฉันจะเห็นว่าคุณพูดถึงมัน ดังนั้น +1
John B

10
+1 สำหรับการชี้ให้เห็นว่า Arrays.asList จะไม่ส่งคืนรายการปกติ หากคุณพยายามที่จะเพิ่มหรือลบองค์ประกอบไปยัง / จากรายการนั้นคุณจะได้รับ UnsupportedOperationException
Alfredo Osorio

9
ฝรั่งตอนนี้มีตั้งแต่ (15.0): . Splitter.on ( "") splitToList (สตริง) บันทึกเป็นขั้นตอนเล็ก ๆ
Kango_V

มีวิธีใดบ้างที่จะเพิ่มค่าว่างใน String iike ถ้าฉัน String เช่นนี้: 1,, 3,4,5 ที่นี่ 2 ไม่มี / ว่าง เมื่อแปลงในรายการ 2 จะข้าม แต่ฉันต้องการเพิ่มเป็นค่าว่าง
A.Aleem11

ปัญหาเกี่ยวกับการใช้งานนี้และตัวอย่างอื่น ๆ ที่คล้ายกันคือแม้ว่าจะArrays.asListให้ wrapper รอบอาร์เรย์ดั้งเดิม (หลีกเลี่ยงการคัดลอกองค์ประกอบ) แต่new ArrayList(...)จะทำเช่นองค์ประกอบโดยองค์ประกอบคัดลอก เราน่าจะชอบแนวทางที่ช่วยให้สามารถแยกวิเคราะห์องค์ประกอบได้โดยตรงในกลุ่มเป้าหมายที่ต้องการ
YoYo

70

สองขั้นตอน:

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

1
เมื่อคุณอินไลน์ตัวแปร items มันก็เหมือนกับคำตอบอื่น ๆ แต่มีประสิทธิภาพมากกว่าเล็กน้อยเนื่องจากไม่ได้ใช้ regex ในทางกลับกันช่องว่างรอบเครื่องหมายจุลภาคจะฆ่าตัวเลือกนี้
Amrinder Arora

2
@AmrinderArora อาร์กิวเมนต์ที่splitถูกตีความว่าเป็น RegEx
Madbreaks

23

นี่คืออีกหนึ่งการแปลง CSV เป็น 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));
}

พิมพ์คุณ

-> string
-> with
-> เครื่องหมายจุลภาค


21

หาก a Listคือเป้าหมายสุดท้ายตามที่ OP ได้ระบุไว้คำตอบที่ยอมรับแล้วจะยังคงสั้นที่สุดและดีที่สุด อย่างไรก็ตามฉันต้องการให้ทางเลือกโดยใช้Java 8 Streamsซึ่งจะให้ประโยชน์มากขึ้นถ้าเป็นส่วนหนึ่งของขั้นตอนการประมวลผลเพิ่มเติม

โดยการตัดผลลัพธ์ของ. split ฟังก์ชัน (อาร์เรย์ดั้งเดิม) ลงในกระแสข้อมูลแล้วแปลงเป็นรายการ

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

หากเป็นสิ่งสำคัญที่ผลลัพธ์จะถูกเก็บไว้ตามArrayListชื่อเรื่องจาก OP คุณสามารถใช้Collectorวิธีการอื่น:

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

หรือโดยใช้การแยกวิเคราะห์ RegEx api:

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

โปรดทราบว่าคุณยังคงสามารถพิจารณาที่จะออกจากlistตัวแปรพิมพ์เป็นแทนList<String> ArrayList<String>อินเทอร์เฟซทั่วไปสำหรับListยังมีลักษณะคล้ายกันมากพอที่จะArrayListใช้งาน

ด้วยตัวเองตัวอย่างรหัสเหล่านี้ดูเหมือนจะไม่เพิ่มจำนวนมาก (ยกเว้นการพิมพ์เพิ่มเติม) แต่ถ้าคุณวางแผนที่จะทำมากขึ้นเช่นคำตอบนี้ในการแปลงสตริงเป็นรายการของ Longs exemplifies API สตรีมมิ่งมีประสิทธิภาพมากโดยการอนุญาต ไปป์ไลน์การปฏิบัติงานของคุณทีละอัน

เพื่อความสมบูรณ์แบบ


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

1
หนึ่งในคำตอบที่ดีที่สุดตอนนี้ รายการสามารถเปลี่ยนแปลงได้ในคำตอบนี้ +1
Sedrick

ทำงานหลังจากเปลี่ยนcollect(toList())เป็นcollect(Collectors.toList()
Sundararaj Govindasamy

ในความเป็นจริงcollect(toList())คือการใช้การนำเข้าคงที่ของ Collectors.toList()สำหรับความกะทัดรัดและความคล่องแคล่ว :)
มนู

15

ไม่มีวิธีการในตัวสำหรับสิ่งนี้ แต่คุณสามารถใช้วิธีแยก () ในสิ่งนี้

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




5

คุณสามารถใช้ Guava เพื่อแยกสตริงและแปลงเป็น ArrayList สิ่งนี้ใช้ได้กับสตริงว่างเช่นกันและส่งคืนรายการเปล่า

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

ส่งออกต่อไปนี้:

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

4

Collectionsตัวอย่างการใช้

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

1
คุณหลีกเลี่ยงตัวกลาง Arrays.asList น่าเสียดายที่เรายังมีสำเนาจากองค์ประกอบอาร์เรย์ลงในคอลเลกชัน ทางเลือกที่น่าจดจำ
YoYo

4

มีหลายวิธีในการแก้ปัญหานี้โดยใช้สตรีมในJava 8แต่ IMO จะมีหนึ่ง liners ต่อไปนี้:

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

ไม่มีใครรู้ว่าฉันสามารถแปลงสตริงนี้เป็นรายการที่คั่นด้วยจุลภาค --String s = "2017-07-12 23: 40: 00.0,153.76,16.140,60.00,, 56.00,"; รายการ <String> splittedString = ArrayList ใหม่ <String> (Arrays.asList (s.split ("\\ s *, \\ s *")))
Sunny

1
นี่เป็นคำถามใหม่อย่าถามเป็นความคิดเห็น อย่าลังเลที่จะสร้างคำถามใหม่
George Siggouroglou

2

คุณสามารถแยกพวกมันออกก่อนโดยใช้String.split(",")แล้วแปลงสตริงที่ส่งคืนarrayเป็นการArrayListใช้Arrays.asList(array)



2

ผลลัพธ์เดียวกันคุณสามารถบรรลุได้โดยใช้คลาส Splitter

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

(เขียนเป็น kotlin)


1
เอกสารบอกว่าฟังก์ชั่นนี้เป็นรุ่นเบต้าและไม่เสถียร
Rubberducker


1

ฉันมักจะใช้รูปแบบ precompiled สำหรับรายการ และนี่ยังเป็นเรื่องสากลมากกว่าเล็กน้อยเนื่องจากสามารถพิจารณาวงเล็บซึ่งเป็นไปตามนิพจน์ 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

ใน Kotlin ถ้ารายการสตริงของคุณเป็นแบบนี้และคุณสามารถใช้สำหรับการแปลงสตริงเป็น ArrayList ให้ใช้รหัสบรรทัดนี้

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


0

คุณสามารถทำได้ดังนี้

การทำเช่นนี้จะลบพื้นที่สีขาวและแยกด้วยเครื่องหมายจุลภาคซึ่งคุณไม่จำเป็นต้องกังวลเกี่ยวกับช่องว่าง

    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

สตริง ->การแปลงชุด : (สตริง -> สตริง [] -> ชุด)

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

การแปลง->การแปลงสตริง [] :

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

สตริง ->การแปลงสตริง [] :

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

และชุด -> ชุดสะสม :

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

-2

แปลงการเก็บเป็นสตริงโดยคั่นด้วยเครื่องหมายจุลภาคในJava 8

listOfString วัตถุมีองค์ประกอบ "A", "B", "C", "D"]

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

ผลลัพธ์คือ: - 'A', 'B', 'C', 'D'

และแปลง Strings Array เป็น List ใน 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
และที่ไหนกันแน่ArrayList? คุณยังอ่านคำถามหรือไม่
Debosmit Ray

@mapeters: ArrayListมีเป็น ฉันย้อนกลับการแก้ไขเป็นการแก้ไขครั้งแรก (เพื่อให้คุณสามารถเห็นได้) และปรับปรุงการจัดรูปแบบการแก้ไขครั้งแรก
เธ

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