Jak mogę uzyskać ostatnią wartość ArrayList?
Nie znam ostatniego indeksu ArrayList.
getLast()
Jak mogę uzyskać ostatnią wartość ArrayList?
Nie znam ostatniego indeksu ArrayList.
getLast()
Odpowiedzi:
Oto część List
interfejsu (który implementuje ArrayList):
E e = list.get(list.size() - 1);
E
jest typem elementu. Jeśli lista jest pusta, get
wyrzuca an IndexOutOfBoundsException
. Całą dokumentację API można znaleźć tutaj .
lastElement()
metodę dla swoich, Vector
ale nie dla ArrayList
. O co chodzi z tą niespójnością?
W waniliowej Javie nie ma eleganckiego sposobu.
Biblioteka Google Guava jest świetna - sprawdź ich Iterables
klasę . Ta metoda rzuci a, NoSuchElementException
jeśli lista jest pusta, w przeciwieństwie do IndexOutOfBoundsException
, jak w typowym size()-1
podejściu - uważam, że jest o NoSuchElementException
wiele ładniejsza, lub możliwość określenia wartości domyślnej:
lastElement = Iterables.getLast(iterableList);
Możesz również podać wartość domyślną, jeśli lista jest pusta, zamiast wyjątku:
lastElement = Iterables.getLast(iterableList, null);
lub, jeśli używasz Opcje:
lastElementRaw = Iterables.getLast(iterableList, null);
lastElement = (lastElementRaw == null) ? Option.none() : Option.some(lastElementRaw);
Iterables.getLast
sprawdzenie, czy RandomAccess
jest zaimplementowane, a zatem czy uzyskuje dostęp do elementu w O (1).
Option
możesz użyć natywnej Java Optional
. Będzie to również nieco czystsze: lastElement = Optional.ofNullable(lastElementRaw);
.
powinno to zrobić:
if (arrayList != null && !arrayList.isEmpty()) {
T item = arrayList.get(arrayList.size()-1);
}
Używam klasy micro-util do uzyskania ostatniego (i pierwszego) elementu listy:
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;
}
}
Nieco bardziej elastyczny:
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
nie sprawdza, czy lista jest pusta i dlatego powinna być, isNullOrEmpty
i to nie jest częścią pytania - albo próbujesz ulepszyć zestaw odpowiedzi, albo podajesz klasy użyteczności (które są ponownym wynalazkiem).
Używanie lambdas:
Function<ArrayList<T>, T> getLast = a -> a.get(a.size() - 1);
Jeśli możesz, zamień na ArrayList
na ArrayDeque
, który ma wygodne metody, takie jak removeLast
.
Nie ma eleganckiego sposobu na uzyskanie ostatniego elementu listy w Javie (w porównaniu np. Do items[-1]
Pythona).
Musisz użyć list.get(list.size()-1)
.
Podczas pracy z listami uzyskanymi za pomocą skomplikowanych wywołań metody obejście polega na zmiennej tymczasowej:
List<E> list = someObject.someMethod(someArgument, anotherObject.anotherMethod());
return list.get(list.size()-1);
Jest to jedyna opcja, aby uniknąć brzydkiej i często drogiej lub nawet niedziałającej wersji:
return someObject.someMethod(someArgument, anotherObject.anotherMethod()).get(
someObject.someMethod(someArgument, anotherObject.anotherMethod()).size() - 1
);
Byłoby miło, gdyby poprawka do tego błędu projektowego została wprowadzona do API Java.
List
interfejsu. Dlaczego chcesz wywoływać metodę zwracającą Listę, jeśli interesuje Cię tylko ostatni element? Nie pamiętam, że widziałem to wcześniej.
list.get(list.size()-1)
stanowi minimalny przykład pokazujący problem. Zgadzam się, że „zaawansowane” przykłady mogą być kontrowersyjne i być może zboczone, chciałem tylko pokazać, w jaki sposób problem może dalej się rozprzestrzeniać. Załóżmy, że klasa someObject
jest obca, pochodzi z zewnętrznej biblioteki.
ArrayDeque
zamiast tego.
ArrayList
.
Jak stwierdzono w rozwiązaniu, jeśli pole List
jest puste, wówczas IndexOutOfBoundsException
wyrzucane jest pole an . Lepszym rozwiązaniem jest użycie Optional
typu:
public class ListUtils {
public static <T> Optional<T> last(List<T> list) {
return list.isEmpty() ? Optional.empty() : Optional.of(list.get(list.size() - 1));
}
}
Jak można się spodziewać, ostatni element listy jest zwracany jako Optional
:
var list = List.of(10, 20, 30);
assert ListUtils.last(list).orElse(-1) == 30;
Również z wdziękiem radzi sobie z pustymi listami:
var emptyList = List.<Integer>of();
assert ListUtils.last(emptyList).orElse(-1) == -1;
Jeśli zamiast tego używasz LinkedList, możesz uzyskać dostęp do pierwszego elementu i ostatniego za pomocą just getFirst()
i getLast()
(jeśli chcesz czystszego sposobu niż size () -1 i uzyskać (0))
Zadeklaruj LinkedList
LinkedList<Object> mLinkedList = new LinkedList<>();
To są metody, których możesz użyć, aby uzyskać to, czego chcesz, w tym przypadku mówimy o PIERWSZYM i OSTATNIM elemencie listy
/**
* 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);
}
Więc możesz użyć
mLinkedList.getLast();
aby uzyskać ostatni element listy.
guava zapewnia inny sposób na uzyskanie ostatniego elementu z List
:
last = Lists.reverse(list).get(0)
jeśli podana lista jest pusta, wyrzuca IndexOutOfBoundsException
java.util.Collections#reverse
robi to też.
Ponieważ indeksowanie w ArrayList zaczyna się od 0 i kończy o jedno miejsce przed rzeczywistym rozmiarem, dlatego poprawną instrukcją do zwrócenia ostatniego elementu tablicy będzie:
int last = mylist.get (mylist.size () - 1);
Na przykład:
jeśli rozmiar listy tablic wynosi 5, to rozmiar-1 = 4 zwróci ostatni element tablicy.
Ostatnim elementem na liście jest list.size() - 1
. Kolekcja jest wspierana przez tablicę, a tablice zaczynają się od indeksu 0.
Tak więc element 1 na liście ma indeks 0 w tablicy
Element 2 na liście ma indeks 1 w tablicy
Element 3 na liście ma indeks 2 w tablicy
i tak dalej..
Co powiesz na to ... Gdzieś w klasie ...
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;
}
Jeśli zmodyfikujesz listę, użyj listIterator()
i powtórz od ostatniego indeksu ( size()-1
odpowiednio). Jeśli znowu się nie powiedzie, sprawdź strukturę listy.
Wszystko, co musisz zrobić, to użyć size (), aby uzyskać ostatnią wartość Arraylist. Np. jeśli masz ArrayList liczb całkowitych, to aby uzyskać ostatnią wartość, będziesz musiał
int lastValue = arrList.get(arrList.size()-1);
Pamiętaj, że elementy w Arraylist można uzyskać za pomocą wartości indeksu. Dlatego ArrayLists są zwykle używane do wyszukiwania elementów.
tablice przechowują swój rozmiar w zmiennej lokalnej o nazwie „length”. Biorąc pod uwagę tablicę o nazwie „a”, możesz użyć następującego polecenia, aby odwołać się do ostatniego indeksu bez znajomości wartości indeksu
a [a.length-1]
aby przypisać wartość 5 do tego ostatniego indeksu, użyłbyś:
a [a.length-1] = 5;
ArrayList
nie jest tablica.
W Kotlin możesz użyć metody last
:
val lastItem = list.last()