Wie kann ich den letzten Wert einer ArrayList erhalten?
Ich kenne den letzten Index der ArrayList nicht.
getLast()
Wie kann ich den letzten Wert einer ArrayList erhalten?
Ich kenne den letzten Index der ArrayList nicht.
getLast()
Antworten:
Folgendes ist Teil der List
Schnittstelle (die ArrayList implementiert):
E e = list.get(list.size() - 1);
E
ist der Elementtyp. Wenn die Liste leer ist, wird ein get
ausgelöst IndexOutOfBoundsException
. Die gesamte API-Dokumentation finden Sie hier .
lastElement()
Methode für sie zu implementieren, Vector
aber nicht für ArrayList
. Was ist mit dieser Inkonsistenz los?
In Vanille-Java gibt es keinen eleganten Weg.
Die Google Guava- Bibliothek ist großartig - sehen Sie sich ihre Iterables
Klasse an . Diese Methode löst a aus, NoSuchElementException
wenn die Liste leer ist, im Gegensatz zu a IndexOutOfBoundsException
, wie beim typischen size()-1
Ansatz - ich finde einen NoSuchElementException
viel schöneren oder die Möglichkeit, einen Standard anzugeben:
lastElement = Iterables.getLast(iterableList);
Sie können anstelle einer Ausnahme auch einen Standardwert angeben, wenn die Liste leer ist:
lastElement = Iterables.getLast(iterableList, null);
oder, wenn Sie Optionen verwenden:
lastElementRaw = Iterables.getLast(iterableList, null);
lastElement = (lastElementRaw == null) ? Option.none() : Option.some(lastElementRaw);
Iterables.getLast
Prüfung hinzufügen, ob sie RandomAccess
implementiert ist und daher auf das Element in O (1) zugreift.
Option
können Sie das native Java verwenden Optional
. Es wird auch etwas sauberer : lastElement = Optional.ofNullable(lastElementRaw);
.
das sollte es tun:
if (arrayList != null && !arrayList.isEmpty()) {
T item = arrayList.get(arrayList.size()-1);
}
Ich benutze die Micro-Util-Klasse, um das letzte (und erste) Element der Liste zu erhalten:
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;
}
}
Etwas flexibler:
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
prüft nicht, ob die Liste leer ist und daher leer sein sollte, isNullOrEmpty
und das ist nicht Teil der Frage - entweder versuchen Sie, die Antworten zu verbessern, oder Sie stellen Dienstprogrammklassen zur Verfügung (die eine Neuerfindung darstellen).
Verwenden von Lambdas:
Function<ArrayList<T>, T> getLast = a -> a.get(a.size() - 1);
Es gibt keine elegante Möglichkeit, das letzte Element einer Liste in Java abzurufen (im Vergleich zu z items[-1]
. B. in Python).
Du musst benutzen list.get(list.size()-1)
.
Bei der Arbeit mit Listen, die durch komplizierte Methodenaufrufe erhalten wurden, liegt die Problemumgehung in einer temporären Variablen:
List<E> list = someObject.someMethod(someArgument, anotherObject.anotherMethod());
return list.get(list.size()-1);
Dies ist die einzige Option, um hässliche und oft teure oder gar nicht funktionierende Versionen zu vermeiden:
return someObject.someMethod(someArgument, anotherObject.anotherMethod()).get(
someObject.someMethod(someArgument, anotherObject.anotherMethod()).size() - 1
);
Es wäre schön, wenn die Korrektur für diesen Konstruktionsfehler in die Java-API eingeführt würde.
List
Benutzeroberfläche hinzugefügt zu werden. Warum sollten Sie eine Methode aufrufen, die eine Liste zurückgibt, wenn Sie nur am letzten Element interessiert sind? Ich erinnere mich nicht, dass ich das jemals zuvor gesehen habe.
list.get(list.size()-1)
das minimale Beispiel, das das Problem zeigt. Ich stimme zu, dass die "fortgeschrittenen" Beispiele kontrovers und möglicherweise ein Randfall sein können. Ich wollte nur zeigen, wie sich das Problem weiter verbreiten kann. Nehmen wir an, dass die Klasse von someObject
fremd ist und aus einer externen Bibliothek stammt.
ArrayDeque
stattdessen besser .
ArrayList
.
Wenn Sie können, tauschen Sie die ArrayList
gegen eine ArrayDeque
, die bequeme Methoden wie hat removeLast
.
Wie in der Lösung angegeben, List
wird ein IndexOutOfBoundsException
geworfen , wenn das leer ist. Eine bessere Lösung ist die Verwendung des Optional
Typs:
public class ListUtils {
public static <T> Optional<T> last(List<T> list) {
return list.isEmpty() ? Optional.empty() : Optional.of(list.get(list.size() - 1));
}
}
Wie zu erwarten, wird das letzte Element der Liste als Optional
: zurückgegeben.
var list = List.of(10, 20, 30);
assert ListUtils.last(list).orElse(-1) == 30;
Es geht auch elegant mit leeren Listen um:
var emptyList = List.<Integer>of();
assert ListUtils.last(emptyList).orElse(-1) == -1;
Wenn Sie stattdessen eine LinkedList verwenden, können Sie mit just getFirst()
und getLast()
(wenn Sie einen saubereren Weg als size () -1 und get (0) möchten) auf das erste und das letzte Element zugreifen.
Deklarieren Sie eine LinkedList
LinkedList<Object> mLinkedList = new LinkedList<>();
Dann sind dies die Methoden, mit denen Sie das bekommen können, was Sie wollen. In diesem Fall handelt es sich um das ERSTE und LETZTE Element einer Liste
/**
* 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);
}
Also, dann kannst du verwenden
mLinkedList.getLast();
um das letzte Element der Liste zu erhalten.
Guave bietet eine andere Möglichkeit, das letzte Element aus einem zu erhalten List
:
last = Lists.reverse(list).get(0)
Wenn die bereitgestellte Liste leer ist, wird ein IndexOutOfBoundsException
java.util.Collections#reverse
macht es auch.
Da die Indizierung in ArrayList bei 0 beginnt und eine Stelle vor der tatsächlichen Größe endet, lautet die korrekte Anweisung zur Rückgabe des letzten Arraylist-Elements:
int last = mylist.get (mylist.size () - 1);
Zum Beispiel:
Wenn die Größe der Array-Liste 5 beträgt, gibt size-1 = 4 das letzte Array-Element zurück.
Das letzte Element in der Liste ist list.size() - 1
. Die Sammlung wird von einem Array unterstützt und Arrays beginnen bei Index 0.
Element 1 in der Liste befindet sich also am Index 0 im Array
Element 2 in der Liste befindet sich am Index 1 im Array
Element 3 in der Liste befindet sich am Index 2 im Array
und so weiter..
Wie wäre es damit .. Irgendwo in deiner Klasse ...
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;
}
Wenn Sie Ihre Liste ändern, verwenden Sie den listIterator()
letzten Index (dh size()-1
). Wenn Sie erneut fehlschlagen, überprüfen Sie Ihre Listenstruktur.
Sie müssen lediglich size () verwenden, um den letzten Wert der Arraylist zu erhalten. Zum Beispiel. Wenn Sie eine ArrayList von Ganzzahlen haben, müssen Sie den letzten Wert ermitteln
int lastValue = arrList.get(arrList.size()-1);
Denken Sie daran, dass auf Elemente in einer Arrayliste mithilfe von Indexwerten zugegriffen werden kann. Daher werden ArrayLists im Allgemeinen zum Suchen von Elementen verwendet.
Arrays speichern ihre Größe in einer lokalen Variablen namens "Länge". Bei einem Array mit dem Namen "a" können Sie Folgendes verwenden, um auf den letzten Index zu verweisen, ohne den Indexwert zu kennen
a [a.Länge-1]
Um diesem letzten Index den Wert 5 zuzuweisen, würden Sie Folgendes verwenden:
a [a.Länge-1] = 5;
ArrayList
kein Array.
In Kotlin können Sie die folgende Methode verwenden last
:
val lastItem = list.last()