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.Listinterface, mas que armazene seus membros em uma ordem classificada. Eu sei que você pode usar um normal ArrayListe 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 addpor 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 addadicionar um elemento ao final da lista, quebrando sua ordem classificada 3) Deixar de addfora (como opcional) jogando um UnsupportedOperationExceptione 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