ฉันจะรับค่าสุดท้ายของ ArrayList ได้อย่างไร
ฉันไม่รู้ดัชนีสุดท้ายของ ArrayList
getLast()
ฉันจะรับค่าสุดท้ายของ ArrayList ได้อย่างไร
ฉันไม่รู้ดัชนีสุดท้ายของ ArrayList
getLast()
คำตอบ:
ต่อไปนี้เป็นส่วนหนึ่งของList
อินเทอร์เฟซ (ซึ่ง ArrayList ใช้):
E e = list.get(list.size() - 1);
E
เป็นประเภทองค์ประกอบ ถ้ารายการว่างเปล่าพ่นget
IndexOutOfBoundsException
คุณสามารถค้นหาเอกสาร API ทั้งหมดที่นี่
lastElement()
วิธีการของพวกเขาแต่ไม่ได้สำหรับVector
ArrayList
เกิดอะไรขึ้นกับความไม่สอดคล้องนั้น?
ไม่มีวิธีที่สวยงามในวานิลลาชวา
Google ฝรั่งห้องสมุดเป็นที่ดี - ตรวจสอบของพวกเขาในชั้นเรียนIterables
วิธีนี้จะโยนNoSuchElementException
ถ้ารายการว่างเปล่าเมื่อเทียบIndexOutOfBoundsException
กับsize()-1
วิธีการทั่วไป- ฉันพบNoSuchElementException
ดีกว่ามากหรือความสามารถในการระบุค่าเริ่มต้น:
lastElement = Iterables.getLast(iterableList);
คุณยังสามารถระบุค่าเริ่มต้นหากรายการว่างเปล่าแทนที่จะเป็นข้อยกเว้น:
lastElement = Iterables.getLast(iterableList, null);
หรือหากคุณใช้ตัวเลือก:
lastElementRaw = Iterables.getLast(iterableList, null);
lastElement = (lastElementRaw == null) ? Option.none() : Option.some(lastElementRaw);
Iterables.getLast
ตรวจสอบว่าRandomAccess
มีการใช้งานหรือไม่และหากมีการเข้าถึงรายการใน O (1)
Option
คุณสามารถใช้พื้นเมือง Optional
Java มันจะสะอาดlastElement = Optional.ofNullable(lastElementRaw);
ขึ้นอีกหน่อย: .
สิ่งนี้ควรทำ:
if (arrayList != null && !arrayList.isEmpty()) {
T item = arrayList.get(arrayList.size()-1);
}
ฉันใช้คลาส micro-util เพื่อรับองค์ประกอบสุดท้าย (และแรก) ของรายการ:
public final class Lists {
private Lists() {
}
public static <T> T getFirst(List<T> list) {
return list != null && !list.isEmpty() ? list.get(0) : null;
}
public static <T> T getLast(List<T> list) {
return list != null && !list.isEmpty() ? list.get(list.size() - 1) : null;
}
}
มีความยืดหยุ่นมากขึ้นเล็กน้อย:
import java.util.List;
/**
* Convenience class that provides a clearer API for obtaining list elements.
*/
public final class Lists {
private Lists() {
}
/**
* Returns the first item in the given list, or null if not found.
*
* @param <T> The generic list type.
* @param list The list that may have a first item.
*
* @return null if the list is null or there is no first item.
*/
public static <T> T getFirst( final List<T> list ) {
return getFirst( list, null );
}
/**
* Returns the last item in the given list, or null if not found.
*
* @param <T> The generic list type.
* @param list The list that may have a last item.
*
* @return null if the list is null or there is no last item.
*/
public static <T> T getLast( final List<T> list ) {
return getLast( list, null );
}
/**
* Returns the first item in the given list, or t if not found.
*
* @param <T> The generic list type.
* @param list The list that may have a first item.
* @param t The default return value.
*
* @return null if the list is null or there is no first item.
*/
public static <T> T getFirst( final List<T> list, final T t ) {
return isEmpty( list ) ? t : list.get( 0 );
}
/**
* Returns the last item in the given list, or t if not found.
*
* @param <T> The generic list type.
* @param list The list that may have a last item.
* @param t The default return value.
*
* @return null if the list is null or there is no last item.
*/
public static <T> T getLast( final List<T> list, final T t ) {
return isEmpty( list ) ? t : list.get( list.size() - 1 );
}
/**
* Returns true if the given list is null or empty.
*
* @param <T> The generic list type.
* @param list The list that has a last item.
*
* @return true The list is empty.
*/
public static <T> boolean isEmpty( final List<T> list ) {
return list == null || list.isEmpty();
}
}
isEmpty
ไม่ตรวจสอบว่ารายการว่างเปล่าหรือไม่และควรเป็นเช่นนั้นisNullOrEmpty
และไม่ใช่ส่วนหนึ่งของคำถาม - ไม่ว่าคุณจะพยายามปรับปรุงชุดคำตอบหรือคุณมีคลาสยูทิลิตี้ให้คุณ (ซึ่งเป็นการประดิษฐ์ใหม่)
size()
วิธีการส่งกลับจำนวนขององค์ประกอบในแบบ ArrayList ค่าดัชนีขององค์ประกอบ0
ผ่าน(size()-1)
ดังนั้นคุณจะใช้myArrayList.get(myArrayList.size()-1)
เพื่อดึงองค์ประกอบสุดท้าย
การใช้ lambdas:
Function<ArrayList<T>, T> getLast = a -> a.get(a.size() - 1);
หากคุณสามารถสลับออกArrayList
สำหรับซึ่งมีวิธีการอำนวยความสะดวกเช่นArrayDeque
removeLast
ไม่มีเป็นสง่างามวิธีการรับองค์ประกอบสุดท้ายของรายการในจาวา (เมื่อเทียบกับเช่นitems[-1]
ในหลาม)
list.get(list.size()-1)
คุณต้องใช้
เมื่อทำงานกับรายการที่ได้จากการเรียกเมธอดที่ซับซ้อนการแก้ปัญหาจะอยู่ในตัวแปรชั่วคราว:
List<E> list = someObject.someMethod(someArgument, anotherObject.anotherMethod());
return list.get(list.size()-1);
นี่เป็นตัวเลือกเดียวที่จะหลีกเลี่ยงเวอร์ชั่นที่น่าเกลียดและมักจะมีราคาแพงหรือแม้กระทั่งไม่ทำงาน:
return someObject.someMethod(someArgument, anotherObject.anotherMethod()).get(
someObject.someMethod(someArgument, anotherObject.anotherMethod()).size() - 1
);
มันจะดีถ้าแก้ไขข้อบกพร่องการออกแบบนี้ได้รับการแนะนำให้รู้จักกับ Java API
List
อินเทอร์เฟซ เหตุใดคุณต้องการเรียกวิธีการส่งคืนรายการถ้าคุณสนใจเฉพาะองค์ประกอบสุดท้าย ฉันจำไม่ได้ว่าเคยเห็นมาก่อนเลย
list.get(list.size()-1)
เป็นตัวอย่างขั้นต่ำที่แสดงถึงปัญหา ฉันยอมรับว่าตัวอย่าง "ขั้นสูง" อาจเป็นที่ถกเถียงกันและอาจเป็นกรณีที่ขอบฉันแค่ต้องการแสดงให้เห็นว่าปัญหาสามารถเผยแพร่ต่อไปได้อย่างไร สมมติว่าคลาสของsomeObject
เป็นคนต่างด้าวมาจากห้องสมุดภายนอก
ArrayDeque
แทน
ArrayList
และมุมมองเพื่อให้มีจำนวนมากของผู้ที่สนใจในการรับค่าสุดท้ายของ
ตามที่ระบุในการแก้ปัญหาถ้าList
ว่างเปล่าแล้วIndexOutOfBoundsException
จะถูกโยน ทางออกที่ดีกว่าคือการใช้Optional
ประเภท:
public class ListUtils {
public static <T> Optional<T> last(List<T> list) {
return list.isEmpty() ? Optional.empty() : Optional.of(list.get(list.size() - 1));
}
}
ตามที่คุณคาดหวังองค์ประกอบสุดท้ายของรายการจะถูกส่งกลับเป็นOptional
:
var list = List.of(10, 20, 30);
assert ListUtils.last(list).orElse(-1) == 30;
นอกจากนี้ยังเกี่ยวข้องกับรายการที่ว่างเปล่าอย่างสง่างามเช่นกัน:
var emptyList = List.<Integer>of();
assert ListUtils.last(emptyList).orElse(-1) == -1;
หากคุณใช้ LinkedList แทนคุณสามารถเข้าถึงองค์ประกอบแรกและองค์ประกอบสุดท้ายได้เพียงgetFirst()
และgetLast()
(ถ้าคุณต้องการวิธีที่สะอาดกว่าขนาด () -1 และรับ (0))
ประกาศ LinkedList
LinkedList<Object> mLinkedList = new LinkedList<>();
นี่คือวิธีการที่คุณสามารถใช้เพื่อให้ได้สิ่งที่คุณต้องการในกรณีนี้เรากำลังพูดถึงองค์ประกอบแรกและสุดท้ายของรายการ
/**
* Returns the first element in this list.
*
* @return the first element in this list
* @throws NoSuchElementException if this list is empty
*/
public E getFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return f.item;
}
/**
* Returns the last element in this list.
*
* @return the last element in this list
* @throws NoSuchElementException if this list is empty
*/
public E getLast() {
final Node<E> l = last;
if (l == null)
throw new NoSuchElementException();
return l.item;
}
/**
* Removes and returns the first element from this list.
*
* @return the first element from this list
* @throws NoSuchElementException if this list is empty
*/
public E removeFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}
/**
* Removes and returns the last element from this list.
*
* @return the last element from this list
* @throws NoSuchElementException if this list is empty
*/
public E removeLast() {
final Node<E> l = last;
if (l == null)
throw new NoSuchElementException();
return unlinkLast(l);
}
/**
* Inserts the specified element at the beginning of this list.
*
* @param e the element to add
*/
public void addFirst(E e) {
linkFirst(e);
}
/**
* Appends the specified element to the end of this list.
*
* <p>This method is equivalent to {@link #add}.
*
* @param e the element to add
*/
public void addLast(E e) {
linkLast(e);
}
ดังนั้นคุณสามารถใช้
mLinkedList.getLast();
เพื่อรับองค์ประกอบสุดท้ายของรายการ
ฝรั่งให้วิธีอื่นในการรับองค์ประกอบสุดท้ายจากList
:
last = Lists.reverse(list).get(0)
หากรายการที่ให้ไว้ว่างเปล่ามันจะส่ง IndexOutOfBoundsException
java.util.Collections#reverse
ทำเช่นกัน
เนื่องจากการจัดทำดัชนีใน ArrayList เริ่มต้นจาก 0 และสิ้นสุดที่เดียวก่อนขนาดจริงดังนั้นคำสั่งที่ถูกต้องเพื่อส่งกลับองค์ประกอบอาร์เรย์สุดท้ายจะเป็น:
int last = mylist.get (mylist.size () - 1);
ตัวอย่างเช่น:
ถ้าขนาดของรายการอาเรย์คือ 5 ดังนั้นขนาด -1 = 4 จะส่งคืนองค์ประกอบอาเรย์สุดท้าย
list.size() - 1
รายการสุดท้ายในรายการเป็น คอลเลกชันได้รับการสนับสนุนโดยอาร์เรย์และอาร์เรย์เริ่มต้นที่ดัชนี 0
ดังนั้นองค์ประกอบ 1 ในรายการอยู่ที่ดัชนี 0 ในอาร์เรย์
องค์ประกอบที่ 2 ในรายการอยู่ที่ดัชนี 1 ในอาร์เรย์
องค์ประกอบ 3 ในรายการอยู่ที่ดัชนี 2 ในอาร์เรย์
และอื่น ๆ ..
แล้วเรื่องนี้ .. อยู่ที่ไหนในชั้นเรียนของคุณ ...
List<E> list = new ArrayList<E>();
private int i = -1;
public void addObjToList(E elt){
i++;
list.add(elt);
}
public E getObjFromList(){
if(i == -1){
//If list is empty handle the way you would like to... I am returning a null object
return null; // or throw an exception
}
E object = list.get(i);
list.remove(i); //Optional - makes list work like a stack
i--; //Optional - makes list work like a stack
return object;
}
หากคุณแก้ไขรายการของคุณให้ใช้listIterator()
และทำซ้ำจากดัชนีล่าสุด (นั่นคือsize()-1
ตามลำดับ) หากคุณล้มเหลวอีกครั้งให้ตรวจสอบโครงสร้างรายการของคุณ
สิ่งที่คุณต้องทำคือใช้ขนาด () เพื่อรับค่าสุดท้ายของ Arraylist สำหรับอดีต ถ้าคุณ ArrayList ของจำนวนเต็มดังนั้นเมื่อต้องการรับค่าสุดท้ายคุณจะต้อง
int lastValue = arrList.get(arrList.size()-1);
โปรดจำไว้ว่าองค์ประกอบใน Arraylist สามารถเข้าถึงได้โดยใช้ค่าดัชนี ดังนั้น ArrayLists จึงถูกใช้เพื่อค้นหารายการ
อาร์เรย์เก็บขนาดไว้ในตัวแปรท้องถิ่นที่เรียกว่า 'length' รับอาร์เรย์ชื่อ "a" คุณสามารถใช้สิ่งต่อไปนี้เพื่ออ้างอิงดัชนีล่าสุดโดยไม่ทราบค่าดัชนี
a [a.length-1]
เพื่อกำหนดค่า 5 ให้กับดัชนีล่าสุดนี้คุณจะใช้:
a [a.length-1] = 5;
ArrayList
ไม่ใช่อาร์เรย์
ทางเลือกโดยใช้ Stream API:
list.stream().reduce((first, second) -> second)
ผลลัพธ์ในตัวเลือกขององค์ประกอบสุดท้าย
ใน Kotlin คุณสามารถใช้วิธีการlast
:
val lastItem = list.last()