Estou perplexo por não conseguir encontrar uma resposta rápida para isso. Estou procurando essencialmente uma estrutura de dados em Java que implemente a java.util.List
interface, mas que armazene seus membros em uma ordem classificada. Eu sei que você pode usar um normal ArrayList
e usar Collections.sort()
nele, mas tenho um cenário em que ocasionalmente estou adicionando e frequentemente recuperando membros da minha lista e não quero ter que classificá-lo toda vez que recuperar um membro no caso de um um novo foi adicionado. Alguém pode me indicar algo que existe no JDK ou mesmo em bibliotecas de terceiros?
EDIT : A estrutura de dados precisará preservar duplicatas.
RESUMO DA RESPOSTA : Achei tudo isso muito interessante e aprendi muito. Aioobe, em particular, merece menção por sua perseverança em tentar cumprir meus requisitos acima (principalmente uma implementação java.util.List classificada que oferece suporte a duplicatas). Aceitei sua resposta como a mais precisa pelo que perguntei e mais instigante sobre as implicações do que estava procurando, mesmo que o que perguntei não fosse exatamente o que eu precisava.
O problema com o que eu pedi está na própria interface List e no conceito de métodos opcionais em uma interface. Para citar o javadoc:
O usuário desta interface tem controle preciso sobre onde na lista cada elemento é inserido.
Inserir em uma lista classificada não tem controle preciso sobre o ponto de inserção. Então, você tem que pensar como irá lidar com alguns dos métodos. Tomemos add
por exemplo:
public boolean add (Object o)
Appends the specified element to the end of this list (optional operation).
Você agora fica na situação desconfortável de 1) Romper o contrato e implementar uma versão classificada de adicionar 2) Permitir add
adicionar um elemento ao final da lista, quebrando sua ordem classificada 3) Deixar de add
fora (como opcional) jogando um UnsupportedOperationException
e implementando outro método que adiciona itens em uma ordem de classificação.
A opção 3 é provavelmente a melhor, mas acho desagradável ter um método add que você não pode usar e outro método SortAdd que não está na interface.
Outras soluções relacionadas (sem ordem específica):
- java.util.PriorityQueue que é provavelmente o mais próximo do que eu precisava do que pedi. Uma fila não é a definição mais precisa de uma coleção de objetos no meu caso, mas funcionalmente ela faz tudo o que preciso.
- net.sourceforge.nite.util.SortedList . No entanto, essa implementação quebra o contrato da interface List ao implementar a classificação no
add(Object obj)
método e, estranhamente, tem um método sem efeito paraadd(int index, Object obj)
. O consenso geral sugere quethrow new UnsupportedOperationException()
pode ser uma escolha melhor neste cenário. - TreeMultiSet do Guava Um conjunto de implementação que suporta duplicatas
- ca.odell.glazedlists.SortedList Essa classe vem com a advertência em seu javadoc:
Warning: This class breaks the contract required by List