Um Java Set mantém a ordem? Um método está retornando um conjunto para mim e, supostamente, os dados são ordenados, mas iterando sobre o conjunto, os dados são desordenados. Existe uma maneira melhor de gerenciar isso? O método precisa ser alterado para retornar algo diferente de um conjunto?
179
Respostas:
A
Set
interface não fornece nenhuma garantia de pedido.Sua subinterface
SortedSet
representa um conjunto que é classificado de acordo com algum critério. No Java 6, existem dois contêineres padrão que implementamSortedSet
. Eles sãoTreeSet
eConcurrentSkipListSet
.Além da
SortedSet
interface, há também aLinkedHashSet
classe Ele se lembra da ordem em que os elementos foram inseridos no conjunto e retorna seus elementos nessa ordem.fonte
LinkedHashSet é o que você precisa.
fonte
List
não é umSet
(não garante a exclusividade da associação).Como muitos dos membros sugeriram, use o LinkedHashSet para manter a ordem da coleção. Você pode agrupar seu conjunto usando esta implementação.
A implementação SortedSet pode ser usada para ordem classificada, mas, para seu propósito, use o LinkedHashSet .
Também a partir dos documentos,
"Esta implementação poupa seus clientes do pedido geralmente caótico não especificado fornecido pelo HashSet, sem incorrer no aumento do custo associado ao TreeSet. Ele pode ser usado para produzir uma cópia de um conjunto que tenha a mesma ordem que o original, independentemente do original. implementação do conjunto: "
Fonte: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
fonte
Set é apenas uma interface. Para manter a ordem, é necessário usar uma implementação específica dessa interface e da subinterface SortedSet, por exemplo, TreeSet ou LinkedHashSet. Você pode agrupar seu conjunto desta maneira:
fonte
Aqui está um rápido resumo das características do pedido das
Set
implementações padrão disponíveis em Java:Para o seu caso específico, você pode classificar os itens primeiro e depois usar qualquer um de 1 ou 2 (provavelmente
LinkedHashSet
ouTreeSet
). Ou, alternativamente e com mais eficiência , você pode adicionar dados não classificados a umTreeSet
que cuidará da classificação automaticamente para você.fonte
Para manter o pedido, use
List
ou aLinkedHashSet
.fonte
LinkedHashSet
, não ...Map
.Um LinkedHashSet é uma versão ordenada do HashSet que mantém uma lista duplamente vinculada em todos os elementos. Use esta classe em vez do HashSet quando se importar com a ordem da iteração.
fonte
Do javadoc para
Set.iterator()
:E, como já afirmado por shuuchan , a
TreeSet
é uma implementaçãoSet
que possui uma ordem garantida:fonte
Normalmente, o set não mantém o pedido, como o HashSet, para encontrar rapidamente um emelent, mas você pode tentar o LinkedHashSet, pois ele manterá o pedido que você fez.
fonte
Existem 2 coisas diferentes.
fonte
A própria interface Set não estipula nenhuma ordem específica. O SortedSet faz no entanto.
fonte
O iterador retornado pelo conjunto não deve retornar dados da maneira ordenada. Veja isso Dois java.util.Iterators para a mesma coleção: eles precisam retornar elementos na mesma ordem?
fonte
Somente
SortedSet
pode fazer o pedido doSet
fonte