ฉันต้องการทราบว่าปลอดภัย / แนะนำให้แปลงจาก ArrayList เป็น Array หรือไม่? ฉันมีไฟล์ข้อความที่มีสตริงแต่ละบรรทัด:
1236
1233
4566
4568
....
ฉันต้องการอ่านลงในรายการอาร์เรย์จากนั้นฉันจะแปลงเป็น Array เป็นที่แนะนำ / ถูกกฎหมายหรือไม่?
ขอบคุณ
ฉันต้องการทราบว่าปลอดภัย / แนะนำให้แปลงจาก ArrayList เป็น Array หรือไม่? ฉันมีไฟล์ข้อความที่มีสตริงแต่ละบรรทัด:
1236
1233
4566
4568
....
ฉันต้องการอ่านลงในรายการอาร์เรย์จากนั้นฉันจะแปลงเป็น Array เป็นที่แนะนำ / ถูกกฎหมายหรือไม่?
ขอบคุณ
คำตอบ:
ใช่การแปลงไฟล์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
The method toArray(T[]) in the type ArrayList<Character> is not applicable for the arguments (char[])
นี่เป็นวิธีที่ดีที่สุด (IMHO)
List<String> myArrayList = new ArrayList<String>();
//.....
String[] myArray = myArrayList.toArray(new String[myArrayList.size()]);
รหัสนี้ใช้งานได้:
String[] myArray = myArrayList.toArray(new String[0]);
แต่มีประสิทธิภาพน้อยกว่า: อาร์เรย์สตริงถูกสร้างขึ้นสองครั้ง: ครั้งแรกที่สร้างอาร์เรย์ที่มีความยาวเป็นศูนย์จากนั้นอาร์เรย์ขนาดจริงจะถูกสร้างเติมและส่งคืน ดังนั้นหากคุณทราบขนาดที่ต้องการ (จากlist.size()
) คุณควรสร้างอาร์เรย์ที่ใหญ่พอที่จะใส่องค์ประกอบทั้งหมดได้ ในกรณีนี้จะไม่มีการจัดสรรใหม่
new String[0]
และnew String[size]
new String[0]
มีประสิทธิภาพมากขึ้นจริง shipilev.net/blog/2016/arrays-wisdom-ancients
ArrayList<String> myArrayList = new ArrayList<String>();
...
String[] myArray = myArrayList.toArray(new String[0]);
ไม่ว่าจะเป็น "ความคิดที่ดี" จะขึ้นอยู่กับกรณีการใช้งานของคุณจริงๆ
Object
สมมติว่า v เป็น ArrayList:
String[] x = (String[]) v.toArray(new String[0]);
มีสองสไตล์ในการแปลงคอลเล็กชันเป็นอาร์เรย์: โดยใช้อาร์เรย์ที่มีขนาดล่วงหน้า (เช่นc.toArray(new String[c.size()])
) หรือใช้อาร์เรย์ว่าง (เช่นc.toArray(new String[0])
) แนะนำให้ใช้ในเวอร์ชัน Java ที่เก่ากว่าโดยใช้อาร์เรย์ขนาดล่วงหน้าเนื่องจากการเรียกการสะท้อนซึ่งจำเป็นในการสร้างอาร์เรย์ที่มีขนาดเหมาะสมค่อนข้างช้า อย่างไรก็ตามตั้งแต่การอัปเดตช่วงปลายของOpenJDK 6การเรียกนี้ได้รับการสรุปทำให้ประสิทธิภาพของเวอร์ชันอาร์เรย์ว่างเหมือนกันและบางครั้งก็ดีขึ้นกว่าเดิมเมื่อเทียบกับเวอร์ชันก่อนกำหนด นอกจากนี้การส่งอาร์เรย์ขนาดล่วงหน้ายังเป็นอันตรายสำหรับการรวบรวมพร้อมกันหรือซิงโครไนซ์เนื่องจากการแข่งขันข้อมูลเป็นไปได้ระหว่างขนาดและการเรียก toArray ซึ่งอาจส่งผลให้มีค่าว่างเพิ่มเติมที่ส่วนท้ายของอาร์เรย์หากคอลเลกชันหดตัวพร้อมกันในระหว่างการดำเนินการ คุณสามารถทำตามสไตล์เครื่องแบบ:ทั้งการใช้อาร์เรย์ที่ว่างเปล่า (ซึ่งเป็นที่แนะนำในปัจจุบัน Java) หรือใช้อาร์เรย์ก่อนขนาด (ซึ่งอาจจะเร็วขึ้นในรุ่นเก่า Java หรือ JVMs ไม่ใช่ HotSpot based)
นี่คือการใช้งานที่แนะนำสำหรับ Java รุ่นใหม่ (> Java 6)
String[] myArray = myArrayList.toArray(new String[0]);
แนะนำให้ใช้ในเวอร์ชัน Java ที่เก่ากว่าโดยใช้อาร์เรย์ขนาดล่วงหน้าเนื่องจากการเรียกการสะท้อนซึ่งจำเป็นในการสร้างอาร์เรย์ที่มีขนาดเหมาะสมค่อนข้างช้า อย่างไรก็ตามตั้งแต่การอัปเดตช่วงปลายของ OpenJDK 6 การเรียกนี้ได้รับการสรุปทำให้ประสิทธิภาพของเวอร์ชันอาร์เรย์ว่างเหมือนกันและบางครั้งก็ดีกว่าเมื่อเทียบกับเวอร์ชันก่อนกำหนด นอกจากนี้การส่งอาร์เรย์ขนาดล่วงหน้ายังเป็นอันตรายสำหรับการรวบรวมพร้อมกันหรือซิงโครไนซ์เนื่องจากการแข่งขันข้อมูลเป็นไปได้ระหว่างขนาดและการเรียก toArray ซึ่งอาจส่งผลให้มีค่าว่างเพิ่มเติมที่ส่วนท้ายของอาร์เรย์หากคอลเลกชันหดตัวพร้อมกันในระหว่างการดำเนินการ การตรวจสอบนี้อนุญาตให้เป็นไปตามสไตล์เครื่องแบบ: ใช้อาร์เรย์ว่าง (ซึ่งแนะนำใน Java สมัยใหม่) หรือใช้อาร์เรย์ขนาดล่วงหน้า (ซึ่งอาจเร็วกว่าใน Java เวอร์ชันเก่าหรือ JVM ที่ไม่ใช่ HotSpot)
อินเทอร์เฟซ 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
แนวทางหนึ่งคือการเพิ่ม 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]);
}
}
}
ArrayList<String> a = new ArrayList<String>();
a.add( "test" );
@SuppressWarnings( "unused")
Object[] array = a.toArray();
ขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุหากคุณต้องการจัดการอาร์เรย์ในภายหลังจะต้องใช้ความพยายามมากกว่าการเก็บสตริงไว้ใน ArrayList คุณยังมีการเข้าถึงแบบสุ่มด้วย ArrayList โดยlist.get( index );