จาก Arraylist ถึง Array


111

ฉันต้องการทราบว่าปลอดภัย / แนะนำให้แปลงจาก ArrayList เป็น Array หรือไม่? ฉันมีไฟล์ข้อความที่มีสตริงแต่ละบรรทัด:

1236
1233
4566
4568
....

ฉันต้องการอ่านลงในรายการอาร์เรย์จากนั้นฉันจะแปลงเป็น Array เป็นที่แนะนำ / ถูกกฎหมายหรือไม่?

ขอบคุณ


8
คุณสามารถทำได้แต่คุณยังไม่ได้ให้ข้อมูลที่เพียงพอที่จะบอกคุณว่าเป็นความคิดที่ดีหรือไม่
Jon Skeet

6
ArrayLists สบายดี เหตุผลเดียวที่ฉันเห็นสำหรับการแปลงเป็น Array คือหากคุณต้องการเรียกใช้เมธอดที่ต้องการ
ไมค์โจนส์

คำตอบ:


214

ใช่การแปลงไฟล์ArrayListเป็นArrayไฟล์. ไม่ว่าจะเป็นความคิดที่ดีขึ้นอยู่กับวัตถุประสงค์การใช้งานของคุณ คุณต้องการการดำเนินการที่ArrayListให้หรือไม่? ถ้าเป็นเช่นนั้นให้เก็บไว้เป็นArrayListไฟล์. อื่นแปลงไป!

ArrayList<Integer> foo = new ArrayList<Integer>();
foo.add(1);
foo.add(1);
foo.add(2);
foo.add(3);
foo.add(5);
Integer[] bar = foo.toArray(new Integer[foo.size()]);
System.out.println("bar.length = " + bar.length);

เอาต์พุต

bar.length = 5

จะเกิดอะไรขึ้นถ้า ArrayList ว่างเปล่า?
ThanosFisherman

48
แล้วมันว่างเปล่า
IMustBeSomeone

1
The method toArray(T[]) in the type ArrayList<Character> is not applicable for the arguments (char[])
Aaron Franke

75

นี่เป็นวิธีที่ดีที่สุด (IMHO)

List<String> myArrayList = new ArrayList<String>();
//.....
String[] myArray = myArrayList.toArray(new String[myArrayList.size()]);

รหัสนี้ใช้งานได้:

String[] myArray = myArrayList.toArray(new String[0]);

แต่มีประสิทธิภาพน้อยกว่า: อาร์เรย์สตริงถูกสร้างขึ้นสองครั้ง: ครั้งแรกที่สร้างอาร์เรย์ที่มีความยาวเป็นศูนย์จากนั้นอาร์เรย์ขนาดจริงจะถูกสร้างเติมและส่งคืน ดังนั้นหากคุณทราบขนาดที่ต้องการ (จากlist.size()) คุณควรสร้างอาร์เรย์ที่ใหญ่พอที่จะใส่องค์ประกอบทั้งหมดได้ ในกรณีนี้จะไม่มีการจัดสรรใหม่


4
คำอธิบายที่ดีเกี่ยวกับความแตกต่างระหว่างnew String[0]และnew String[size]
gamliela

4
new String[0]มีประสิทธิภาพมากขึ้นจริง shipilev.net/blog/2016/arrays-wisdom-ancients
Radiodef

5
ArrayList<String> myArrayList = new ArrayList<String>();
...
String[] myArray = myArrayList.toArray(new String[0]);

ไม่ว่าจะเป็น "ความคิดที่ดี" จะขึ้นอยู่กับกรณีการใช้งานของคุณจริงๆ


ขอบคุณเพียงแค่อยากรู้ว่าฉันไม่จำเป็นต้องประกาศขนาดอาร์เรย์หรือ
Eddy Freeman

JavaDocs เป็นเพื่อนของคุณ หากอาร์เรย์ที่ส่งผ่านมีขนาดเล็กเกินไปจะมีการส่งคืนอาร์เรย์ใหม่ เวอร์ชันอื่นของวิธีการที่ไม่มี args จะส่งกลับอาร์เรย์ของObject
Brian Roach


1

มีสองสไตล์ในการแปลงคอลเล็กชันเป็นอาร์เรย์: โดยใช้อาร์เรย์ที่มีขนาดล่วงหน้า (เช่นc.toArray(new String[c.size()])) หรือใช้อาร์เรย์ว่าง (เช่นc.toArray(new String[0])) แนะนำให้ใช้ในเวอร์ชัน Java ที่เก่ากว่าโดยใช้อาร์เรย์ขนาดล่วงหน้าเนื่องจากการเรียกการสะท้อนซึ่งจำเป็นในการสร้างอาร์เรย์ที่มีขนาดเหมาะสมค่อนข้างช้า อย่างไรก็ตามตั้งแต่การอัปเดตช่วงปลายของOpenJDK 6การเรียกนี้ได้รับการสรุปทำให้ประสิทธิภาพของเวอร์ชันอาร์เรย์ว่างเหมือนกันและบางครั้งก็ดีขึ้นกว่าเดิมเมื่อเทียบกับเวอร์ชันก่อนกำหนด นอกจากนี้การส่งอาร์เรย์ขนาดล่วงหน้ายังเป็นอันตรายสำหรับการรวบรวมพร้อมกันหรือซิงโครไนซ์เนื่องจากการแข่งขันข้อมูลเป็นไปได้ระหว่างขนาดและการเรียก toArray ซึ่งอาจส่งผลให้มีค่าว่างเพิ่มเติมที่ส่วนท้ายของอาร์เรย์หากคอลเลกชันหดตัวพร้อมกันในระหว่างการดำเนินการ คุณสามารถทำตามสไตล์เครื่องแบบ:ทั้งการใช้อาร์เรย์ที่ว่างเปล่า (ซึ่งเป็นที่แนะนำในปัจจุบัน Java) หรือใช้อาร์เรย์ก่อนขนาด (ซึ่งอาจจะเร็วขึ้นในรุ่นเก่า Java หรือ JVMs ไม่ใช่ HotSpot based)


1

นี่คือการใช้งานที่แนะนำสำหรับ Java รุ่นใหม่ (> Java 6)

String[] myArray = myArrayList.toArray(new String[0]);

แนะนำให้ใช้ในเวอร์ชัน Java ที่เก่ากว่าโดยใช้อาร์เรย์ขนาดล่วงหน้าเนื่องจากการเรียกการสะท้อนซึ่งจำเป็นในการสร้างอาร์เรย์ที่มีขนาดเหมาะสมค่อนข้างช้า อย่างไรก็ตามตั้งแต่การอัปเดตช่วงปลายของ OpenJDK 6 การเรียกนี้ได้รับการสรุปทำให้ประสิทธิภาพของเวอร์ชันอาร์เรย์ว่างเหมือนกันและบางครั้งก็ดีกว่าเมื่อเทียบกับเวอร์ชันก่อนกำหนด นอกจากนี้การส่งอาร์เรย์ขนาดล่วงหน้ายังเป็นอันตรายสำหรับการรวบรวมพร้อมกันหรือซิงโครไนซ์เนื่องจากการแข่งขันข้อมูลเป็นไปได้ระหว่างขนาดและการเรียก toArray ซึ่งอาจส่งผลให้มีค่าว่างเพิ่มเติมที่ส่วนท้ายของอาร์เรย์หากคอลเลกชันหดตัวพร้อมกันในระหว่างการดำเนินการ การตรวจสอบนี้อนุญาตให้เป็นไปตามสไตล์เครื่องแบบ: ใช้อาร์เรย์ว่าง (ซึ่งแนะนำใน Java สมัยใหม่) หรือใช้อาร์เรย์ขนาดล่วงหน้า (ซึ่งอาจเร็วกว่าใน Java เวอร์ชันเก่าหรือ JVM ที่ไม่ใช่ HotSpot)


0

อินเทอร์เฟซ Collection ประกอบด้วยเมธอด toArray () เพื่อแปลงคอลเล็กชันใหม่เป็นอาร์เรย์ มีสองรูปแบบของวิธีนี้ เวอร์ชันที่ไม่มีอาร์กิวเมนต์จะส่งคืนองค์ประกอบของคอลเล็กชันในอาร์เรย์ Object: public Object [] toArray () อาร์เรย์ที่ส่งคืนไม่สามารถส่งไปยังประเภทข้อมูลอื่นได้ นี่เป็นเวอร์ชันที่ง่ายที่สุด เวอร์ชันที่สองกำหนดให้คุณส่งผ่านประเภทข้อมูลของอาร์เรย์ที่คุณต้องการส่งคืน: public Object [] toArray (Object type [])

 public static void main(String[] args) {  
           List<String> l=new ArrayList<String>();  
           l.add("A");  
           l.add("B");  
           l.add("C");  
           Object arr[]=l.toArray();  
           for(Object a:arr)  
           {  
                String str=(String)a;  
                System.out.println(str);  
           }  
      }  

สำหรับการอ้างอิงโปรดดูลิงค์นี้http://techno-terminal.blogspot.in/2015/11/how-to-obtain-array-from-arraylist.html


0

แนวทางหนึ่งคือการเพิ่ม Second for Loop ซึ่งการพิมพ์กำลังดำเนินการภายในช่องแรกสำหรับการวนซ้ำ แบบนี้:

static String[] SENTENCE; 

public static void main(String []args) throws Exception{

   Scanner sentence = new Scanner(new File("assets/blah.txt"));
   ArrayList<String> sentenceList = new ArrayList<String>();

   while (sentence.hasNextLine())
   {
       sentenceList.add(sentence.nextLine());
   }

   sentence.close();

   String[] sentenceArray = sentenceList.toArray(new String[sentenceList.size()]);
  // System.out.println(sentenceArray.length);
   for (int r=0;r<sentenceArray.length;r++)
   {
       SENTENCE = sentenceArray[r].split("(?<=[.!?])\\s*"); //split sentences and store in array 

       for (int i=0;i<SENTENCE.length;i++)
       {
           System.out.println("Sentence " + (i+1) + ": " + SENTENCE[i]);
       }
   }    

}

0
ArrayList<String> a = new ArrayList<String>();
a.add( "test" );
@SuppressWarnings( "unused")
Object[] array = a.toArray();

ขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุหากคุณต้องการจัดการอาร์เรย์ในภายหลังจะต้องใช้ความพยายามมากกว่าการเก็บสตริงไว้ใน ArrayList คุณยังมีการเข้าถึงแบบสุ่มด้วย ArrayList โดยlist.get( index );

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