792 Stimmen

Wie man den letzten Wert einer ArrayList erhält

Wie kann ich den letzten Wert einer ArrayList erhalten?

8voto

Tregoreg Punkte 14864

Es gibt keine elegant Weg, das letzte Element einer Liste in Java zu erhalten (im Vergleich zu z.B. items[-1] in Python).

Sie müssen Folgendes verwenden list.get(list.size()-1) .

Bei der Arbeit mit Listen, die durch komplizierte Methodenaufrufe erhalten werden, liegt die Abhilfe in temporären Variablen:

List<E> list = someObject.someMethod(someArgument, anotherObject.anotherMethod());
return list.get(list.size()-1);

Dies ist die einzige Möglichkeit, 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 dieser Konstruktionsfehler in der Java-API behoben würde.

7voto

Verwendung von Lambdas:

Function<ArrayList<T>, T> getLast = a -> a.get(a.size() - 1);

6voto

Colin Breame Punkte 1267

Wie in der Lösung angegeben, muss die List leer ist, wird ein IndexOutOfBoundsException geworfen wird. Eine bessere Lösung ist die Verwendung der Optional Typ:

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 :

var list = List.of(10, 20, 30);
assert ListUtils.last(list).orElse(-1) == 30;

Auch mit leeren Listen geht es gut zurecht:

var emptyList = List.<Integer>of();
assert ListUtils.last(emptyList).orElse(-1) == -1;

6voto

BitfullByte Punkte 3507

Falls Sie ein Spring-Projekt haben, können Sie auch die CollectionUtils.lastElement von Spring ( javadoc ), so dass Sie keine zusätzliche Abhängigkeit wie Google Guava hinzufügen müssen.

Es ist null-sicher, wenn Sie also null übergeben, erhalten Sie einfach null zurück. Seien Sie jedoch vorsichtig bei der Behandlung der Antwort.

Hier sind einige Unit-Tests, um sie zu demonstrieren:

@Test
void lastElementOfList() {
    var names = List.of("John", "Jane");

    var lastName = CollectionUtils.lastElement(names);

    then(lastName)
        .as("Expected Jane to be the last name in the list")
        .isEqualTo("Jane");
}

@Test
void lastElementOfSet() {
    var names = new TreeSet<>(Set.of("Jane", "John", "James"));

    var lastName = CollectionUtils.lastElement(names);

    then(lastName)
        .as("Expected John to be the last name in the list")
        .isEqualTo("John");
}

Nota: org.assertj.core.api.BDDAssertions#then(java.lang.String) wird für Behauptungen verwendet.

5voto

John Glassmyer Punkte 301

Wenn Sie können, tauschen Sie die ArrayList für eine ArrayDeque , die über praktische Methoden wie removeLast .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X