¿Por qué las API de colecciones de Java no tienen un último método? [cerrado]

19

Esto es para colecciones ordenadas, por ejemplo, java.util.List. ¿Por qué los diseñadores de idiomas no incluyeron un último método? Las únicas razones por las que puedo pensar son:

  • ambigüedad cuando la colección está vacía (devolver nulo o lanzar excepción)
  • Hinchazón API

¿Alguna otra razón?

tres tazas
fuente
99
+1 por la gran cantidad de veces que he tenido que escribir collection.get(collection.size() - 1).
jprete
1
¿Por qué no escribir su propia clase de utilidad que tenga este método y cualquier otro método que desee usar con colecciones?
Mahmoud Hossam
77
Tampoco hay un método first (), entonces ¿por qué debería haber un método last ()?
Peter Taylor
66
@Peter urgh lo único peor que no implementar getLast () es implementarlo con un truco como get (-1).
Alb
2
@Alb supongo que "piratear" está en el ojo del espectador :) En este momento, aprecio la sintaxis -1 de python. Por supuesto, si me preguntas de nuevo en algún momento en el futuro o en el pasado, puedo sentir exactamente lo mismo que tú.
tres tazas

Respuestas:

13

API bloat es probablemente la respuesta. Según mi experiencia, la única vez que necesité esta funcionalidad, una Cola o una Pila fue la estructura de datos correcta para el trabajo que tenía el método apropiado.

Alba
fuente
Supongo que está parcialmente en lo correcto, pero si Java admite la get(-1)recuperación desde el final de una lista, haría lo que el OP quisiera sin agregar una hinchazón de API. Mi respuesta como tal ha generado votos negativos inexplicables.
user949300
1
Creo que una respuesta más importante es que la falla inicial de Java (repetida en .NET, y aún en curso en el último caso) para admitir métodos de interfaz predeterminados significaba que tener interfaces incluye un miembro que el 99% de las implementaciones manejaría de la misma manera impondría trabajo adicional en todas las implementaciones en beneficio de unos pocos que las implementarían de manera diferente.
supercat
16

un last()método es tan fácil como list.get(list.size()-1), al igual que no hay ningún first()método o fifth()método. No es tan difícil de sintetizar y es una especialización. También puede hacer reverse()la lista y list.get(0)cuál dará el lastartículo. Cosas que son fáciles de hacer, generalmente no obtienen sus propios métodos especializados.

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

da como resultado el siguiente resultado

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

También es presuntuoso suponer que todo lo que implementa la Listinterfaz realmente tiene el concepto de last()cualquier cosa.


fuente
1
Sería más claro en ambos casos, sin embargo
Anto
Tenga en cuenta que es posible que el método size () no pueda responder si la colección aún no está completamente poblada.
1
.size()devolverá el tamaño actual .size()-1seguirá siendo el último elemento independientemente, ¿cómo sabría si estaba completamente poblado o no?
1
Según la especificación, una Lista puede contener más de elementos Integer.MAX_VALUE, en cuyo caso size () devuelve Integer.MAX_VALUE, por .size()-1lo que no es la manera perfecta de implementar last()(aunque una lista tan grande es muy poco probable y me pregunto cómo tal lista implementaría toArray()...)
user281377
1
C # tiene un método .Primero y .Último. Invertir una lista solo para obtener el último elemento tampoco es exactamente eficiente.
Carra
5

El java.util.LinkedListdefine los métodos getLast()y getFirst(). Lamentablemente, estos métodos no están definidos en una de sus interfaces, por lo que debe usar el tipo LinkedList. Si solo le interesa el último elemento, puede considerar utilizar el método de la java.util.Queueinterfaz peek(). LinkedList implementa Queue.

René Link
fuente
0

Básicamente que o bien tienen que pedir el size()de for-loop o iterar al preguntar por su iterador y utilizarlo en un tiempo o hacer bucles. Use el adecuado para su propósito.

El iterador sabe en un punto dado si hay más entradas y le permite obtener la siguiente si las hay. Luego repite hasta "más entradas?" falla

Consulte la sección "Colecciones transversales" en http://download.oracle.com/javase/tutorial/collections/interfaces/collection.html


fuente
Esta no es una respuesta a la pregunta. También es extremadamente ineficiente usar un iterador para encontrar el último elemento en una lista.
fishinear