เคล็ดลับที่นี่กำหนด "ย้อนกลับ" หนึ่งสามารถแก้ไขรายการในสถานที่สร้างสำเนาในลำดับย้อนกลับหรือสร้างมุมมองในลำดับที่กลับรายการ
วิธีที่ง่ายที่สุดคือพูดโดยสังหรณ์ใจคือCollections.reverse
:
Collections.reverse(myList);
วิธีการนี้จะปรับเปลี่ยนรายการในสถานที่ นั่นคือCollections.reverse
ใช้รายการและเขียนทับองค์ประกอบของมันโดยไม่มีการคัดลอกที่ไม่มีการย้อนกลับ เหมาะสำหรับกรณีการใช้งานบางกรณี แต่ไม่เหมาะสำหรับผู้อื่น นอกจากนี้จะถือว่ารายการสามารถแก้ไขได้ หากเป็นที่ยอมรับเราก็ดี
หากไม่สามารถสร้างสำเนาในลำดับที่กลับกันได้:
static <T> List<T> reverse(final List<T> list) {
final List<T> result = new ArrayList<>(list);
Collections.reverse(result);
return result;
}
วิธีการนี้ใช้งานได้ แต่ต้องวนซ้ำในรายการสองครั้ง ตัวสร้างการคัดลอก ( new ArrayList<>(list)
) วนซ้ำตามรายการและทำCollections.reverse
เช่นนั้น เราสามารถเขียนวิธีนี้ซ้ำอีกครั้งเพียงครั้งเดียวหากเราเอียงมาก:
static <T> List<T> reverse(final List<T> list) {
final int size = list.size();
final int last = size - 1;
// create a new list, with exactly enough initial capacity to hold the (reversed) list
final List<T> result = new ArrayList<>(size);
// iterate through the list in reverse order and append to the result
for (int i = last; i >= 0; --i) {
final T element = list.get(i);
result.add(element);
}
// result now holds a reversed copy of the original list
return result;
}
นี้มีประสิทธิภาพมากขึ้น แต่ยัง verbose มากขึ้น
นอกจากนี้เราสามารถเขียนข้างต้นใหม่เพื่อใช้stream
API ของ Java 8 ซึ่งบางคนพบว่ากระชับและอ่านง่ายกว่าข้างต้น:
static <T> List<T> reverse(final List<T> list) {
final int last = list.size() - 1;
return IntStream.rangeClosed(0, last) // a stream of all valid indexes into the list
.map(i -> (last - i)) // reverse order
.mapToObj(list::get) // map each index to a list element
.collect(Collectors.toList()); // wrap them up in a list
}
nb ที่Collectors.toList()
ทำให้มีการรับประกันน้อยมากเกี่ยวกับรายการผลลัพธ์ หากคุณต้องการมั่นใจว่าผลลัพธ์จะกลับมาเป็น ArrayList ให้ใช้Collectors.toCollection(ArrayList::new)
แทน
ตัวเลือกที่สามคือการสร้างมุมมองในการสั่งซื้อกลับรายการ นี่เป็นวิธีที่ซับซ้อนกว่าและคุ้มค่าที่จะอ่านเพิ่มเติม / คำถามของมันเอง รายการ # ย้อนกลับของ Guava เป็นจุดเริ่มต้นที่ทำงานได้
การเลือกการใช้งาน "ที่ง่ายที่สุด" จะถูกนำไปใช้เป็นแบบฝึกหัดสำหรับผู้อ่าน