Perché le API delle raccolte Java non hanno un ultimo metodo? [chiuso]


19

Questo è per le raccolte ordinate, ad esempio java.util.List. Perché i progettisti del linguaggio non hanno incluso un ultimo metodo? Le uniche ragioni che mi vengono in mente sono:

  • ambiguità quando la raccolta è vuota (restituisce null o genera un'eccezione)
  • Gonfia API

Qualche altro motivo?


9
+1 per il numero assoluto di volte che ho dovuto scrivere collection.get(collection.size() - 1).
giovedì

1
Perché non scrivere la propria classe di utilità con questo metodo e qualsiasi altro metodo che si desidera utilizzare con le raccolte?
Mahmoud Hossam,

7
Non esiste neanche un metodo first (), quindi perché dovrebbe esserci un metodo last ()?
Peter Taylor,

6
@Peter urgh l'unica cosa peggiore di non implementare getLast () è implementarlo con un hack come get (-1).
Alb

2
@Alb Immagino che "hack" sia negli occhi di chi guarda :) A questo punto, apprezzo la sintassi -1 di Python. Certo, se me lo chiedi di nuovo in futuro o in passato, potrei sentirmi esattamente come te.
tre tazze,

Risposte:


13

Il gonfiamento dell'API è probabilmente la risposta. Dalla mia esperienza, l'unica volta che ho avuto bisogno di questa funzionalità, una coda o uno stack è stata la struttura dati corretta per il lavoro con il metodo appropriato.


Immagino che tu sia parzialmente corretto, ma se Java supportasse il get(-1)recupero dalla fine di un elenco, farebbe ciò che l'OP voleva senza aggiungere un eccesso di API. La mia risposta in quanto tale ha disegnato downvotes inspiegabili.
user949300

1
Penso che una risposta più grande sia che l'errore iniziale di Java (ripetuto in .NET, e ancora in corso in quest'ultimo caso) nel supportare i metodi di interfaccia predefiniti significasse che avere interfacce includesse un membro che il 99% delle implementazioni avrebbe gestito allo stesso modo imponendo lavoro extra su tutte le implementazioni a beneficio di pochi che le implementerebbero diversamente.
supercat

16

un last()metodo è altrettanto semplice come list.get(list.size()-1), proprio come non esiste un first()metodo o un fifth()metodo. Non è così difficile da sintetizzare ed è una specializzazione. È inoltre possibile reverse()l'elenco e list.get(0)che darà l' lastelemento. Le cose che sono facili da fare, di solito non ottengono i loro metodi specializzati.

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

risulta nel seguente output

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

è anche presuntuoso supporre che tutto ciò che implementa l' Listinterfaccia abbia effettivamente il concetto di last()qualcosa.


1
In entrambi i casi sarebbe più chiaro
Anto,

Si noti che il metodo size () potrebbe non essere in grado di rispondere se la raccolta non è ancora completamente popolata.

1
.size()restituirà la dimensione corrente .size()-1sarà comunque l'ultimo elemento indipendentemente, come farebbe a sapere se fosse completamente popolato o no?

1
Secondo le specifiche, un elenco può contenere più di elementi Integer.MAX_VALUE, nel qual caso size () restituisce Integer.MAX_VALUE, quindi .size()-1non è il modo perfetto per implementarlo last()(anche se un elenco così ampio è molto improbabile e mi chiedo come sia un tale elenco implementerebbe toArray()...)
user281377

1
C # ha un metodo .First & .Last. Anche invertire un elenco solo per ottenere l'ultimo elemento non è esattamente efficiente.
Carra,

5

La java.util.LinkedListdefinisce la getLast()e getFirst()metodi. Sfortunatamente questi metodi non sono definiti in una delle sue interfacce, quindi devi usare il tipo LinkedList. Se sei interessato solo all'ultimo elemento, potresti considerare di utilizzare il metodo java.util.Queuedell'interfaccia peek(). LinkedList implementa la coda.


0

Fondamentalmente hai per chiedere il size()per un for-loop o iterate esso chiedendo per il suo iteratore e utilizzarlo in un po 'o fare-loop. Usa quello adatto al tuo scopo.

L'iteratore sa a un certo punto se ci sono più voci e ti permette di ottenere quella successiva se c'è. Quindi ripeti fino a "più voci?" non riesce.

Vedi la sezione "Traversing Collections" su http://download.oracle.com/javase/tutorial/collections/interfaces/collection.html


Questa non è una risposta alla domanda. È anche estremamente inefficiente utilizzare un iteratore per trovare l'ultimo elemento in un elenco.
fishinear del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.