Làm thế nào tôi có thể nhận được giá trị cuối cùng của một ArrayList?
Tôi không biết chỉ mục cuối cùng của ArrayList.
getLast()
Làm thế nào tôi có thể nhận được giá trị cuối cùng của một ArrayList?
Tôi không biết chỉ mục cuối cùng của ArrayList.
getLast()
Câu trả lời:
Sau đây là một phần của List
giao diện (mà ArrayList thực hiện):
E e = list.get(list.size() - 1);
E
là loại phần tử. Nếu danh sách trống, get
ném một IndexOutOfBoundsException
. Bạn có thể tìm thấy toàn bộ tài liệu API tại đây .
lastElement()
phương pháp đơn giản cho họ Vector
nhưng không phải cho ArrayList
. Có chuyện gì với sự mâu thuẫn đó?
Không có một cách thanh lịch trong Java vani.
Các Google Ổi thư viện là rất tốt - kiểm tra của họ Iterables
lớp . Phương pháp này sẽ đưa ra NoSuchElementException
nếu danh sách trống, trái ngược với một IndexOutOfBoundsException
, như với size()-1
cách tiếp cận thông thường - tôi thấy NoSuchElementException
đẹp hơn nhiều hoặc khả năng chỉ định mặc định:
lastElement = Iterables.getLast(iterableList);
Bạn cũng có thể cung cấp một giá trị mặc định nếu danh sách trống, thay vì một ngoại lệ:
lastElement = Iterables.getLast(iterableList, null);
hoặc, nếu bạn đang sử dụng Tùy chọn:
lastElementRaw = Iterables.getLast(iterableList, null);
lastElement = (lastElementRaw == null) ? Option.none() : Option.some(lastElementRaw);
Iterables.getLast
kiểm tra xem có RandomAccess
được triển khai hay không và do đó nếu nó được truy cập vào mục trong O (1).
Option
, bạn có thể sử dụng Java nguyên gốc Optional
. Nó cũng sẽ sạch hơn một chút : lastElement = Optional.ofNullable(lastElementRaw);
.
điều này nên làm điều đó:
if (arrayList != null && !arrayList.isEmpty()) {
T item = arrayList.get(arrayList.size()-1);
}
Tôi sử dụng lớp micro-produc để lấy phần tử cuối cùng (và đầu tiên) của danh sách:
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;
}
}
Hơi linh hoạt hơn:
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
không kiểm tra xem danh sách có trống hay không và do đó isNullOrEmpty
không phải là một phần của câu hỏi - hoặc bạn cố gắng nâng cao bộ câu trả lời hoặc bạn cung cấp cho bạn các lớp tiện ích (là một phát minh lại).
Sử dụng lambdas:
Function<ArrayList<T>, T> getLast = a -> a.get(a.size() - 1);
Không có cách nào thanh lịch để lấy phần tử cuối cùng của danh sách trong Java (so với ví dụ items[-1]
trong Python).
Bạn phải sử dụng list.get(list.size()-1)
.
Khi làm việc với các danh sách thu được bằng các cuộc gọi phương thức phức tạp, cách giải quyết nằm ở biến tạm thời:
List<E> list = someObject.someMethod(someArgument, anotherObject.anotherMethod());
return list.get(list.size()-1);
Đây là tùy chọn duy nhất để tránh phiên bản xấu xí và thường đắt tiền hoặc thậm chí không hoạt động:
return someObject.someMethod(someArgument, anotherObject.anotherMethod()).get(
someObject.someMethod(someArgument, anotherObject.anotherMethod()).size() - 1
);
Sẽ thật tuyệt nếu sửa lỗi cho lỗi thiết kế này được đưa vào API Java.
List
giao diện. Tại sao bạn muốn gọi một phương thức trả về Danh sách, nếu bạn chỉ quan tâm đến phần tử cuối cùng? Tôi không nhớ là tôi đã thấy điều đó trước đây.
list.get(list.size()-1)
là ví dụ tối thiểu cho thấy vấn đề. Tôi đồng ý rằng các ví dụ "nâng cao" có thể gây tranh cãi và có thể là một trường hợp cạnh, tôi chỉ muốn chỉ ra làm thế nào vấn đề có thể lan truyền thêm. Hãy giả sử rằng lớp của someObject
nước ngoài, đến từ thư viện bên ngoài.
ArrayDeque
.
ArrayList
.
Nếu bạn có thể, trao đổi ArrayList
cho một ArrayDeque
, có phương pháp thuận tiện như removeLast
.
Như đã nêu trong giải pháp, nếu List
trống thì an IndexOutOfBoundsException
được ném. Một giải pháp tốt hơn là sử dụng Optional
loại:
public class ListUtils {
public static <T> Optional<T> last(List<T> list) {
return list.isEmpty() ? Optional.empty() : Optional.of(list.get(list.size() - 1));
}
}
Như bạn mong đợi, phần tử cuối cùng của danh sách được trả về dưới dạng Optional
:
var list = List.of(10, 20, 30);
assert ListUtils.last(list).orElse(-1) == 30;
Nó cũng xử lý một cách duyên dáng với các danh sách trống:
var emptyList = List.<Integer>of();
assert ListUtils.last(emptyList).orElse(-1) == -1;
Nếu bạn sử dụng LinkedList thay thế, bạn có thể truy cập phần tử đầu tiên và phần tử cuối cùng chỉ getFirst()
và getLast()
(nếu bạn muốn một cách sạch hơn kích thước () -1 và get (0))
Khai báo một danh sách liên kết
LinkedList<Object> mLinkedList = new LinkedList<>();
Sau đó, đây là các phương pháp bạn có thể sử dụng để có được những gì bạn muốn, trong trường hợp này chúng ta đang nói về yếu tố FIRST và LAST của danh sách
/**
* 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);
}
Vì vậy, sau đó bạn có thể sử dụng
mLinkedList.getLast();
để có được yếu tố cuối cùng của danh sách.
ổi cung cấp một cách khác để có được yếu tố cuối cùng từ a List
:
last = Lists.reverse(list).get(0)
nếu danh sách được cung cấp trống, nó sẽ ném IndexOutOfBoundsException
java.util.Collections#reverse
nó cũng vậy
Vì việc lập chỉ mục trong ArrayList bắt đầu từ 0 và kết thúc một vị trí trước kích thước thực tế do đó câu lệnh đúng để trả về phần tử danh sách mảng cuối cùng sẽ là:
int last = mylist.get (mylist.size () - 1);
Ví dụ:
nếu kích thước của danh sách mảng là 5, thì size-1 = 4 sẽ trả về phần tử mảng cuối cùng.
Mục cuối cùng trong danh sách là list.size() - 1
. Bộ sưu tập được hỗ trợ bởi một mảng và các mảng bắt đầu ở chỉ số 0.
Vì vậy, phần tử 1 trong danh sách nằm ở chỉ số 0 trong mảng
Phần tử 2 trong danh sách nằm ở chỉ số 1 trong mảng
Phần tử 3 trong danh sách nằm ở chỉ số 2 trong mảng
và như thế..
Làm thế nào về điều này .. Một nơi nào đó trong lớp của bạn ...
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;
}
Nếu bạn sửa đổi danh sách của mình, sau đó sử dụng listIterator()
và lặp lại từ chỉ mục cuối cùng ( size()-1
tương ứng). Nếu bạn thất bại một lần nữa, kiểm tra cấu trúc danh sách của bạn.
Tất cả những gì bạn cần làm là sử dụng size () để lấy giá trị cuối cùng của Arraylist. Dành cho người cũ nếu bạn ArrayList các số nguyên, thì để có được giá trị cuối cùng, bạn sẽ phải
int lastValue = arrList.get(arrList.size()-1);
Hãy nhớ rằng, các phần tử trong Arraylist có thể được truy cập bằng các giá trị chỉ mục. Do đó, ArrayLists thường được sử dụng để tìm kiếm các mục.
mảng lưu trữ kích thước của chúng trong một biến cục bộ gọi là 'chiều dài'. Đưa ra một mảng có tên là "a", bạn có thể sử dụng thông tin sau để tham chiếu chỉ mục cuối cùng mà không cần biết giá trị chỉ mục
một [a.length-1]
để gán giá trị 5 cho chỉ mục cuối cùng này, bạn sẽ sử dụng:
a [a.length-1] = 5;
ArrayList
không phải là một mảng.
Thay thế bằng API Stream:
list.stream().reduce((first, second) -> second)
Kết quả trong một tùy chọn của yếu tố cuối cùng.
Trong Kotlin, bạn có thể sử dụng phương thức last
:
val lastItem = list.last()