Se alguém estiver familiarizado com Objective-C, há uma coleção chamada NSOrderedSet
que atua como Set e seus itens podem ser acessados como os de um Array .
Existe algo assim em Java?
Ouvi dizer que existe uma coleção chamada LinkedHashMap
, mas não encontrei nada parecido para um conjunto.
java
collections
set
Uko
fonte
fonte
Respostas:
Dê uma olhada na classe LinkedHashSet
Do documento Java :
Tabela de hash e implementação de lista vinculada da interface Set, com ordem de iteração previsível . Essa implementação difere do HashSet porque mantém uma lista duplamente vinculada em todas as suas entradas. Esta lista vinculada define a ordem das iterações, que é a ordem em que os elementos foram inseridos no conjunto (ordem de inserção) . Observe que a ordem de inserção não é afetada se um elemento for inserido novamente no conjunto . (Um elemento e é reinserido em um conjunto s se s.add (e) for invocado quando s.contains (e) retornaria verdadeiro imediatamente antes da invocação.).
fonte
LinkedHashMap
mas eu não encontrei de alguma forma.LinkedHashSet
que permita descobrir em qual índice o elemento está também.Cada conjunto possui um iterador (). O iterador de um HashSet normal é bastante aleatório, um TreeSet faz isso por ordem de classificação, um iterador LinkedHashSet itera por ordem de inserção.
Você não pode substituir um elemento em um LinkedHashSet, entretanto. Você pode remover um e adicionar outro, mas o novo elemento não estará no lugar do original. Em um LinkedHashMap, você pode substituir um valor por uma chave existente e, então, os valores ainda estarão na ordem original.
Além disso, você não pode inserir em uma determinada posição.
Talvez seja melhor você usar um ArrayList com uma verificação explícita para evitar a inserção de duplicatas.
fonte
LinkedHashSet
deve fazer isso. Obrigado pela respostaDê uma olhada no documento da API padrão Java . Ao lado
LinkedHashMap
, há umLinkedHashSet
. Mas observe que a ordem nesses é a ordem de inserção, não a ordem natural dos elementos. E você só pode iterar nessa ordem, não fazer acesso aleatório (exceto contando as etapas de iteração).Também existe uma interface
SortedSet
implementada porTreeSet
eConcurrentSkipListSet
. Ambos permitem iteração na ordem natural de seus elementos ou umComparator
, mas não acesso aleatório ou ordem de inserção.Para uma estrutura de dados que tenha acesso eficiente por índice e possa implementar com eficiência o critério definido, você precisaria de uma lista de pular , mas não há implementação com essa funcionalidade na API Java Standard, embora esteja certo de que é fácil encontrar uma na internet.fonte
ConcurrentSkipListMap
eConcurrentSkipListSet
. Ambos mantêm uma classificação baseada na ordem natural ou um Comparador. Não entendo se eles fornecem o acesso aleatório ou a ordem de entrada que você discute.TreeSet
está ordenado.http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html
fonte
Tente usar
java.util.TreeSet
esses implementosSortedSet
.Para citar o documento:
Observe que adicionar, remover e contém um log de custo de tempo (n).
Se você deseja acessar o conteúdo do conjunto como um Array, pode convertê-lo fazendo:
Este array será classificado com os mesmos critérios do TreeSet (natural ou por um comparador) e, em muitos casos, isso terá uma vantagem em vez de um Arrays.sort ()
fonte
c
e, em seguida, elementoa
, como eu iterar sobre uma coleção que eu quero para obtê-los na mesma ordem:c
,a
etc.treeet é um conjunto ordenado, mas você não pode acessar por meio de um índice de itens, apenas iterar ou ir para o início / fim.
fonte
Se estamos falando de implementação barata da lista de saltos, eu me pergunto, em termos de big O, qual é o custo desta operação:
Quero dizer, sempre fica preso em uma criação de array inteiro, então é O (n):
fonte
size()
método do conjunto subjacente. A iteração é geralmenteO(n)
, o tamanho geralmente é,O(1)
excetoConcurrentSkipListSet
onde estáO(n)
.IndexedTreeSet do projeto de mapa de árvore indexado fornece essa funcionalidade (conjunto ordenado / classificado com acesso semelhante a lista por índice).
fonte
Você também pode obter alguma utilidade de um mapa bidirecional como o
BiMap
do Google GuavaCom a
BiMap
, você pode mapear com bastante eficiência um Integer (para acesso ao índice aleatório) para qualquer outro tipo de objeto.BiMap
s são um para um, portanto, qualquer dado inteiro tem, no máximo, um elemento associado a ele e qualquer elemento tem um inteiro associado. É habilmente sustentado por duasHashTable
instâncias, então usa quase o dobro da memória, mas é muito mais eficiente do que um costume noList
que diz respeito ao processamento porquecontains()
(que é chamado quando um item é adicionado para verificar se já existe) é um tempo constante e operação paralela amigável comoHashSet
a de, enquantoList
a implementação de é MUITO mais lenta.fonte
Eu tive um problema parecido. Eu não precisava exatamente de um conjunto ordenado, mas sim de uma lista com um
indexOf
/ rápidocontains
. Como não encontrei nada por aí, implementei um sozinho. Aqui está o código, ele implementa ambosSet
eList
, embora nem todas as operações de lista em massa sejam tão rápidas quanto asArrayList
versões.isenção de responsabilidade: não testado
fonte