Warum haben die Java Collections APIs keine letzte Methode? [geschlossen]


19

Dies gilt für bestellte Sammlungen, zB java.util.List. Warum haben die Sprachdesigner keine letzte Methode aufgenommen? Die einzigen Gründe, die mir einfallen, sind:

  • Mehrdeutigkeit, wenn die Auflistung leer ist (Rückgabe einer Null- oder Ausnahmebedingung)
  • API aufblähen

Andere Gründe?


9
+1 für die bloße Häufigkeit, mit der ich schreiben musste collection.get(collection.size() - 1).
Jprete

1
Warum schreiben Sie nicht Ihre eigene Utility-Klasse, die diese Methode und eine andere Methode enthält, die Sie möglicherweise für Sammlungen verwenden möchten?
Mahmoud Hossam

7
Es gibt auch keine first () -Methode. Warum sollte es also eine last () -Methode geben?
Peter Taylor

6
@ Peter urgh das einzige, was schlimmer ist als nicht getLast () zu implementieren, ist es mit einem Hack wie get (-1) zu implementieren.
Alb

2
@Alb Ich denke, "Hack" ist im Auge des Betrachters :) Zu diesem Zeitpunkt schätze ich die -1-Syntax von Python. Wenn Sie mich in Zukunft oder in der Vergangenheit noch einmal fragen, fühle ich mich möglicherweise genauso wie Sie.
Drei-Tassen

Antworten:


13

API Bloat ist wahrscheinlich die Antwort. Nach meiner Erfahrung war das einzige Mal, dass ich diese Funktionalität für eine Warteschlange oder einen Stapel benötigte, die richtige Datenstruktur für den Job mit der entsprechenden Methode.


Vermutlich sind Sie teilweise richtig, aber wenn Java das get(-1)Abrufen vom Ende einer Liste unterstützt, würde es das tun, was das OP wollte, ohne API-Aufblähung hinzuzufügen. Meine Antwort als solche hat zu ungeklärten Abstimmungen geführt.
user949300

1
Ich denke, eine größere Antwort ist, dass das anfängliche Versagen von Java (das in .NET wiederholt wurde und in letzterem Fall immer noch andauert), Standardschnittstellenmethoden zu unterstützen, dazu führte, dass Schnittstellen ein Mitglied enthielten, das von 99% der Implementierungen auf die gleiche Weise behandelt wurde, was zusätzlichen Aufwand bedeutete auf alle Implementierungen zugunsten der wenigen, die sie anders implementieren würden.
Supercat

16

Eine last()Methode ist genauso einfach wie list.get(list.size()-1), genauso wie es keine first()Methode oder fifth()Methode gibt. Es ist nicht so schwer zu synthetisieren und ist eine Spezialisierung. Sie können auch reverse()die Liste und list.get(0)die den lastArtikel geben. Dinge, die einfach zu tun sind, bekommen normalerweise keine eigenen spezialisierten Methoden.

import java.util.ArrayList;
import java.util.List;

public class Main
{
    public static void main(String[] args)
    {
        final List<String> l = new ArrayList<String>();

        l.add("A");
        l.add("B");
        l.add("Z");

        System.out.println("l.get(0) = " + l.get(0));
        System.out.println("l.get(l.size()-1) = " + l.get(l.size() - 1));
    }
}

ergibt die folgende Ausgabe

l.get(0) = A
l.get(l.size()-1) = Z

Es ist auch vermessen anzunehmen, dass alles, was die ListSchnittstelle implementiert , tatsächlich das Konzept von last()irgendetwas hat.


1
In beiden Fällen wäre es jedoch klarer
Anto

Beachten Sie, dass die size () -Methode möglicherweise nicht antworten kann, wenn die Auflistung noch nicht vollständig gefüllt ist.

1
.size()Gibt zurück, dass die aktuelle Größe .size()-1immer noch das letzte Element ist, unabhängig davon, wie würde es wissen, ob es vollständig gefüllt ist oder nicht?

1
Durch die Spezifikation kann eine Liste enthalten mehr als Integer.MAX_VALUE Elemente, wobei size () Integer.MAX_VALUE zurückgibt, so .size()-1ist nicht die perfekte Art und Weise zu implementieren last()(wenn auch eine so große Liste sehr unwahrscheinlich ist , und ich frage mich , wie eine solche Liste würde implementieren toArray()...)
user281377

1
C # hat eine .First & .Last-Methode. Das Umkehren einer Liste, um das letzte Element zu erhalten, ist ebenfalls nicht gerade effizient.
Carra

5

Das java.util.LinkedListdefiniert die getLast()und getFirst()Methoden. Leider sind diese Methoden nicht in einer ihrer Schnittstellen definiert, sodass Sie den LinkedList-Typ verwenden müssen. Wenn Sie sich nur für das letzte Element interessieren, können Sie java.util.Queuedie peek()Methode der Schnittstelle verwenden. LinkedList implementiert Queue.


0

Grundsätzlich müssen Sie entweder nach der size()for for-Schleife fragen oder sie durchlaufen, indem Sie nach ihrem Iterator fragen und sie in einer while- oder do-Schleife verwenden. Verwenden Sie den für Ihren Zweck geeigneten.

Der Iterator weiß zu einem bestimmten Zeitpunkt, ob weitere Einträge vorhanden sind, und ermöglicht es Ihnen, den nächsten abzurufen, falls vorhanden. Sie wiederholen dann bis "weitere Einträge?" scheitert.

Weitere Informationen finden Sie im Abschnitt "Durchsuchen von Sammlungen" unter http://download.oracle.com/javase/tutorial/collections/interfaces/collection.html


Dies ist keine Antwort auf die Frage. Es ist auch äußerst ineffizient, einen Iterator zu verwenden, um das letzte Element in einer Liste zu finden.
Fischinear
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.