Por que as APIs de coleções Java não têm um último método? [fechadas]


19

Isto é para coleções ordenadas, por exemplo, java.util.List. Por que os designers de linguagem não incluíram um último método? As únicas razões pelas quais consigo pensar são:

  • ambiguidade quando a coleção estiver vazia (retornar nulo ou lançar exceção)
  • Inchaço da API

Alguma outra razão?


9
+1 pelo número absoluto de vezes que tive que escrever collection.get(collection.size() - 1).
jprete

1
Por que não escrever sua própria classe de utilitário que possui esse método e qualquer outro método que você queira usar com coleções?
Mahmoud Hossam

7
Também não existe um método first (); então, por que deveria haver um last ()?
21411 Peter

6
@ Peter urgh a única coisa pior do que não implementar getLast () é implementá-lo com um hack como get (-1).
19411 Alb

2
@ Alb Acho que "hack" está nos olhos de quem vê :) Neste momento, eu aprecio a sintaxe -1 do python. Obviamente, se você me perguntar novamente em algum momento no futuro ou no passado, talvez eu me sinta exatamente como você.
three-cups

Respostas:


13

O inchaço da API é provavelmente a resposta. Pela minha experiência, a única vez em que precisei dessa funcionalidade, uma Fila ou Pilha, foi a estrutura de dados correta para o trabalho com o método apropriado.


Acho que você está parcialmente correto, mas se o Java suportasse get(-1)a recuperação do final de uma lista, ele faria o que o OP queria sem adicionar o inchaço da API. Minha resposta, como tal, atraiu votos inexplicáveis.
precisa saber é o seguinte

1
Eu acho que uma resposta maior é que a falha inicial do Java (repetida no .NET e ainda em andamento no último caso) para suportar métodos de interface padrão significava que ter interfaces inclui um membro que 99% das implementações lidaria da mesma maneira, imporia trabalho extra em todas as implementações para o benefício de poucos que as implementariam de maneira diferente.
precisa

16

um last()método é tão fácil quanto list.get(list.size()-1), assim como não há first()método ou fifth()método. Não é tão difícil de sintetizar e é uma especialização. Você também pode reverse()listar e list.get(0)qual será o lastitem. As coisas fáceis de fazer geralmente não têm seus próprios 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));
    }
}

resulta na seguinte saída

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

também é presunçoso supor que tudo que implementa a Listinterface realmente tem o conceito de last()qualquer coisa.


1
Seria mais claro nos dois casos
Anto

Observe que o método size () pode não ser capaz de responder se a coleção ainda não estiver totalmente preenchida.

1
.size()retornará o tamanho atual .size()-1ainda será o último elemento, independentemente, como saberia se estivesse totalmente preenchido ou não?

1
Pela especificação, uma lista pode conter mais do que elementos Integer.MAX_VALUE; nesse caso, size () retorna Integer.MAX_VALUE, portanto, .size()-1não é a maneira perfeita de implementar last()(embora uma lista tão grande seja muito improvável e eu me pergunto como essa lista implementaria toArray()...)
user281377 9/12/12

1
O C # possui um método .First & .Last. A reversão de uma lista apenas para obter o último item também não é exatamente eficiente.
Carra

5

O java.util.LinkedListdefine os métodos getLast()e getFirst(). Infelizmente, esses métodos não estão definidos em uma de suas interfaces, portanto, você deve usar o tipo LinkedList. Se você está interessado apenas no último elemento, considere usar o método java.util.Queueda interface peek(). O LinkedList implementa a Fila.


0

Basicamente você tem que pedir a size()um for-loop ou iterate lo, pedindo por sua iterador e usá-lo em um tempo ou fazer-loop. Use o adequado para o seu propósito.

O iterador sabe em um determinado momento se há mais entradas e permite que você obtenha a próxima, se houver. Você então repete até "mais entradas?" falha.

Consulte a seção "Atravessando coleções" em http://download.oracle.com/javase/tutorial/collections/interfaces/collection.html


Esta não é uma resposta para a pergunta. Também é extremamente ineficiente usar um iterador para encontrar o último elemento em uma lista.
fishinear próximo de 25/11
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.