ค่อนข้างใหม่กับภาษาจาวาฉันพยายามทำความคุ้นเคยกับทุกวิธี (หรืออย่างน้อยก็ไม่ใช่คนที่ไม่ใช่พยาธิวิทยา) ที่อาจทำซ้ำผ่านรายการ (หรืออาจจะเป็นชุดอื่น ๆ ) และข้อดีหรือข้อเสียของแต่ละคน
รับList<E> list
วัตถุฉันรู้วิธีต่อไปนี้เพื่อวนรอบองค์ประกอบทั้งหมด:
พื้นฐานสำหรับการ วนซ้ำ (แน่นอนว่ามีความเท่าเทียมwhile
/ do while
ลูปด้วย)
// Not recommended (see below)!
for (int i = 0; i < list.size(); i++) {
E element = list.get(i);
// 1 - can call methods of element
// 2 - can use 'i' to make index-based calls to methods of list
// ...
}
หมายเหตุ: ในฐานะ @amarseillan ชี้ให้เห็นรูปแบบนี้เป็นทางเลือกที่ดีกว่าสำหรับวนList
s เพราะการปฏิบัติจริงของวิธีการอาจจะไม่เป็นที่มีประสิทธิภาพเมื่อใช้get
Iterator
ตัวอย่างเช่นLinkedList
การใช้งานจะต้องสำรวจองค์ประกอบทั้งหมดก่อนหน้า i เพื่อรับองค์ประกอบที่ i
ในตัวอย่างข้างต้นไม่มีวิธีสำหรับการList
ใช้งานเพื่อ "บันทึกตำแหน่ง" เพื่อให้การทำซ้ำในอนาคตมีประสิทธิภาพมากขึ้น สำหรับArrayList
มันไม่สำคัญเพราะความซับซ้อน / ค่าใช้จ่ายของget
เวลาคงที่ (O (1)) ในขณะที่LinkedList
มันเป็นสัดส่วนกับขนาดของรายการ (O (n))
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความซับซ้อนในการคำนวณของการCollections
ใช้งานในตัวโปรดดูคำถามนี้
ปรับปรุงแล้วสำหรับลูป (อธิบายได้ดีในคำถามนี้ )
for (E element : list) {
// 1 - can call methods of element
// ...
}
iterator
for (Iterator<E> iter = list.iterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element from the list
// ...
}
ListIterator
for (ListIterator<E> iter = list.listIterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element from the list
// 3 - can use iter.add(...) to insert a new element into the list
// between element and iter->next()
// 4 - can use iter.set(...) to replace the current element
// ...
}
ฟังก์ชั่น Java
list.stream().map(e -> e + 1); // Can apply a transformation function for e
Iterable.forEach , Stream.forEach , ...
(วิธีการแผนที่จาก API สตรีมของ Java 8 (ดูคำตอบของ @ i_am_zero))
ในคลาสคอลเลกชัน Java 8 ที่นำไปใช้Iterable
(ตัวอย่างเช่นList
s ทั้งหมด) มีforEach
เมธอดซึ่งสามารถใช้แทนคำสั่ง for loop ที่แสดงด้านบน (นี่คือคำถามอื่นที่ให้การเปรียบเทียบที่ดี)
Arrays.asList(1,2,3,4).forEach(System.out::println);
// 1 - can call methods of an element
// 2 - would need reference to containing object to remove an item
// (TODO: someone please confirm / deny this)
// 3 - functionally separates iteration from the action
// being performed with each item.
Arrays.asList(1,2,3,4).stream().forEach(System.out::println);
// Same capabilities as above plus potentially greater
// utilization of parallelism
// (caution: consequently, order of execution is not guaranteed,
// see [Stream.forEachOrdered][stream-foreach-ordered] for more
// information about this).
มีวิธีอื่นอีกไหมถ้ามี?
(BTW ความสนใจของฉันไม่ได้เกิดจากความปรารถนาที่จะเพิ่มประสิทธิภาพการทำงาน ; ฉันแค่อยากรู้ว่าแบบฟอร์มใดที่ฉันมีให้ในฐานะนักพัฒนา)
List
ส่วนต่อประสานเฉพาะหรือไม่