Pourquoi les API de collections Java n'ont-elles pas de dernière méthode? [fermé]

19

C'est pour les collections ordonnées, par exemple java.util.List. Pourquoi les concepteurs de langage n'ont-ils pas inclus une dernière méthode? Les seules raisons auxquelles je peux penser sont:

  • ambiguïté lorsque la collection est vide (retourne null ou exception exception)
  • API ballonnement

D'autres raisons?

trois tasses
la source
9
+1 pour le nombre de fois que j'ai dû écrire collection.get(collection.size() - 1).
jprete
1
Pourquoi ne pas écrire votre propre classe utilitaire qui a cette méthode, et toute autre méthode que vous voudrez peut-être utiliser avec des collections?
Mahmoud Hossam
7
Il n'y a pas non plus de méthode first (), alors pourquoi devrait-il y avoir une méthode last ()?
Peter Taylor
6
@Peter urgh la seule chose pire que de ne pas implémenter getLast () est de l'implémenter avec un hack comme get (-1).
Alb
2
@Alb Je suppose que "hack" est dans l'œil du spectateur :) À ce stade, j'apprécie la syntaxe -1 de python. Bien sûr, si vous me demandez à nouveau dans le futur ou dans le passé, je peux me sentir exactement comme vous.
trois tasses

Réponses:

13

Le gonflement de l'API est probablement la réponse. D'après mon expérience, la seule fois où j'ai eu besoin de cette fonctionnalité, une file d'attente ou une pile était la structure de données correcte pour le travail ayant la méthode appropriée.

Alb
la source
Je suppose que vous avez partiellement raison, mais si Java get(-1)permettait de récupérer à partir de la fin d'une liste, il ferait ce que l'OP voulait sans ajouter de gonflement d'API. Ma réponse en tant que telle a attiré des votes négatifs inexpliqués.
user949300
1
Je pense qu'une réponse plus importante est que l'échec initial de Java (répété dans .NET, et toujours en cours dans ce dernier cas) pour prendre en charge les méthodes d'interface par défaut signifiait que le fait d'avoir des interfaces incluent un membre que 99% des implémentations géreraient de la même manière imposerait un travail supplémentaire sur toutes les implémentations au profit de quelques-uns qui les implémenteraient différemment.
supercat
16

une last()méthode est aussi simple que list.get(list.size()-1), comme il n'y a pas de first()méthode ou de fifth()méthode. Ce n'est pas si difficile à synthétiser et c'est une spécialisation. Vous pouvez également reverse()la liste et list.get(0)qui donnera l' lastélément. Les choses faciles à faire n'ont généralement pas leurs propres méthodes spécialisées.

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

donne la sortie suivante

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

il est également présomptueux de supposer que tout ce qui implémente l' Listinterface a réellement le concept de last()n'importe quoi.


la source
1
Ce serait plus clair dans les deux cas cependant
Anto
Notez que la méthode size () peut ne pas être en mesure de répondre si la collection n'est pas encore entièrement remplie.
1
.size()retournera la taille actuelle .size()-1sera toujours le dernier élément, comment pourrait-il savoir s'il a été entièrement rempli ou non?
1
Selon la spécification, une liste peut contenir plus que des éléments Integer.MAX_VALUE, auquel cas size () renvoie Integer.MAX_VALUE, ce .size()-1n'est donc pas le moyen idéal de mettre en œuvre last()(bien qu'une telle grande liste soit très peu probable et je me demande comment une telle liste implémenterait toArray()...)
user281377
1
C # a une méthode .First & .Last. Inverser une liste juste pour obtenir le dernier élément n'est pas exactement efficace non plus.
Carra
5

Le java.util.LinkedListdéfinit les méthodes getLast()et getFirst(). Malheureusement, ces méthodes ne sont pas définies dans l'une de ses interfaces, vous devez donc utiliser le type LinkedList. Si vous n'êtes intéressé que par le dernier élément, vous pouvez envisager d'utiliser la méthode de l' java.util.Queueinterface peek(). LinkedList implémente Queue.

René Link
la source
0

Fondamentalement , vous avez soit de demander l' size()un for-loop ou itérer en demandant pour son iterator et l' utiliser dans un certain temps ou faire en boucle. Utilisez celui qui vous convient.

L'itérateur sait à un moment donné s'il y a plus d'entrées et vous permet d'obtenir la suivante s'il y en a. Vous répétez ensuite jusqu'à "plus d'entrées?" échoue.

Voir la section "Traversing Collections" sur http://download.oracle.com/javase/tutorial/collections/interfaces/collection.html


la source
Ce n'est pas une réponse à la question. Il est également extrêmement inefficace d'utiliser un itérateur pour rechercher le dernier élément d'une liste.
fishinear