Dlaczego interfejsy API kolekcji Java nie mają ostatniej metody? [Zamknięte]

19

Dotyczy to zamówionych kolekcji, np. Java.util.List. Dlaczego projektanci języków nie zastosowali ostatniej metody? Jedyne powody, o których mogę myśleć to:

  • dwuznaczność, gdy kolekcja jest pusta (zwróć wartość null lub wyrzuć wyjątek)
  • Nadęty API

Jakieś inne powody?

trzy filiżanki
źródło
9
+1 za samą liczbę razy, które musiałem napisać collection.get(collection.size() - 1).
jprete
1
Dlaczego nie napisać własną klasę użytkową, która ma tę metodę, a każda inna metoda może chcesz korzystać z kolekcji?
Mahmoud Hossam
7
Nie jest to pierwsza metoda () albo, więc dlaczego nie być ostatnia metoda ()?
Peter Taylor
6
@Peter urgh jedyną rzeczą gorszą niż niewdrożenie getLast () realizuje go z hack jak get (-1).
Alb.
2
@Alb Myślę, że „hack” jest w oku patrzącego :) W tym momencie doceniam składnię Pythona -1. Oczywiście, jeśli chodzi o mnie jeszcze kiedyś w przyszłości lub w przeszłości, może czuję dokładnie tak, jak to zrobić.
trzy filiżanki

Odpowiedzi:

13

API uwędzić jest prawdopodobnie odpowiedzią. Z mojego doświadczenia wynika, że ​​tylko raz byłem potrzebny tę funkcjonalność kolejki lub stosu była prawidłowa struktura danych dla zadania mającego odpowiednią metodę.

Alba
źródło
Zgadnij, że masz częściowo rację, ale jeśli Java obsługuje get(-1)pobieranie z końca listy, zrobiłby to, czego chciał OP bez dodawania nadmiaru API. Moja odpowiedź jako taki został sporządzony niewyjaśnionych downvotes.
user949300
1
Myślę, że większa odpowiedź jest taka, że początkowy brak Javy (powtórzony w .NET i nadal trwają w ostatnim przypadku) do metod domyślny interfejs wsparcie oznaczało, że posiadające interfejsy zawierać element, który będzie obsługiwać w ten sam sposób 99% wdrożeń wiązałyby dodatkowej pracy we wszystkich wdrożeniach z korzyścią dla kilku, które wdrażałyby je inaczej.
supercat
16

last()metoda jest tak samo proste, jak list.get(list.size()-1), podobnie jak nie istnieje first()metoda lub fifth()metody. Synteza nie jest trudna i jest specjalizacją. Możesz także reverse()listę i list.get(0)która da lastprzedmiot. Rzeczy, które są łatwe do zrobienia, zwykle nie mają własnych specjalistycznych metod.

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));
    }
}

daje następujący wynik

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

założeniem jest, że wszystko, co implementuje Listinterfejs, ma pojęcie last()czegokolwiek.


źródło
1
To byłoby bardziej przejrzyste, choć w obu przypadkach
Anto
Należy zauważyć, że metoda size () może nie być w stanie odpowiedzieć, jeśli zbiór nie jest jeszcze w pełni wypełniane.
1
.size()powróci aktualny rozmiar .size()-1będzie jeszcze ostatni element niezależnie od tego, jak by to wiedzieć, czy to był w pełni wypełniona, czy nie?
1
Zgodnie ze specyfikacją lista może zawierać więcej niż elementy Integer.MAX_VALUE, w którym to przypadku size () zwraca Integer.MAX_VALUE, więc .size()-1nie jest to idealny sposób na implementację last()(chociaż tak duża lista jest bardzo mało prawdopodobna i zastanawiam się, jak taka lista zaimplementuje toArray()...)
user281377
1
C # ma metodę .First & .Last. Odwracanie listy tylko po to, by zdobyć ostatni element, również nie jest wydajne.
Carra,
5

java.util.LinkedListOkreśla getLast()i getFirst()metod. Niestety metody te nie są zdefiniowane w jednym z jego interfejsów, więc musisz użyć typu LinkedList. Jeśli interesuje Cię tylko ostatni element, możesz rozważyć użycie metody java.util.Queueinterfejsu peek(). LinkedList implementuje kolejkę.

René Link
źródło
0

Zasadniczo trzeba albo poprosić o size()na for-loop lub iterate to prosząc o jego iterator i używać go na jakiś czas lub zrób pętlę. Użyj tego, który jest odpowiedni do twoich celów.

Iterator wie w danym punkcie, jeśli istnieje więcej wpisów i pozwala uzyskać następną jeżeli tam jest. Następnie powtarzaj, aż „więcej wpisów?” zawodzi.

Zobacz sekcję „Przechodzenie kolekcji” na stronie http://download.oracle.com/javase/tutorial/collections/interfaces/collection.html


źródło
To nie jest odpowiedź na pytanie. Jest również bardzo nieefektywne użycie iteratora do znalezienia ostatniego elementu na liście.
fishinear