Usei NSSets muitas vezes em meus aplicativos, mas nunca criei um sozinho.
ios
objective-c
arrays
cocoa
cocoa-touch
geminiCoder
fonte
fonte
A imagem da Documentação da Apple o descreve muito bem:
Array
é uma sequência ordenada (a ordem é mantida quando você adiciona) de elementosSet
é uma lista distinta (sem duplicatas) e não ordenada de elementosfonte
A melhor resposta é a documentação da própria Apple .
A principal diferença é que se
NSArray
trata de uma coleção ordenada eNSSet
de uma coleção não ordenada.Existem vários artigos por aí que falam sobre a diferença de velocidade entre os dois, como este . Se você estiver iterando em uma coleção não ordenada,
NSSet
é ótimo. No entanto, em muitos casos, você precisa fazer coisas que apenas umNSArray
pode fazer, então você sacrifica a velocidade por essas habilidades.NSSet
NSArray
Isso é tudo que realmente importa! Deixe-me saber se isso ajudar.
fonte
NSSet
por causa da indexação. É comum usar duas estruturas de dados diferentes para os mesmos dados. Ou você constrói e indexa nesse array :) Mas então é melhor usar um banco de dados que já o tenha implementado.NSSet
eNSArray
, minha resposta é precisa e completa. Sim, você pode construir outras estruturas de dados, mas estou apenas comparando essas duas.NSArray
e de alguma funcionalidade deNSSet
, a resposta correta não é "usarNSArray
e sacrificar o desempenho". A resposta é combinar ambos ou usar uma estrutura de dados diferente.NSOrderedSet está disponível no iOS 5+, portanto, a principal diferença passa a ser se você deseja duplicar objetos na estrutura de dados.
fonte
NSArray :
NSSet :
fonte
Uma matriz é usada para acessar itens por seu índice. Qualquer item pode ser inserido na matriz várias vezes. As matrizes mantêm a ordem de seus elementos.
Um conjunto é usado basicamente apenas para verificar se o item está na coleção ou não. Os itens não têm conceito de ordem ou indexação. Você não pode ter um item em um conjunto duas vezes.
Se um array deseja verificar se contém um elemento, ele deve verificar todos os seus itens. Os conjuntos são projetados para usar algoritmos mais rápidos.
Você pode imaginar um conjunto como um dicionário sem valores.
Observe que array e set não são as únicas estruturas de dados. Existem outros, por exemplo, Fila, Pilha, Pilha, Pilha de Fibonacci. Eu recomendaria a leitura de um livro sobre algoritmos e estruturas de dados.
Veja wikipedia para mais informações.
fonte
contains
operação éO(n)
. Número de comparações quando não está na matrizn
. O número médio de comparações quando o objeto está na matriz én/2
. Mesmo que o objeto seja encontrado, o desempenho é péssimo.NSArray
s têm outras vantagens de velocidade em relação aosNSSet
s. Como sempre, é uma troca.a matriz
o conjunto
fonte
As principais diferenças já foram dadas em outras respostas.
Gostaria apenas de observar que, devido à maneira como os conjuntos e os dicionários são implementados (ou seja, usando hashes), deve-se ter cuidado para não usar objetos mutáveis para as chaves.
Se uma chave sofrer mutação, o hash (provavelmente) também mudará, apontando para um índice / depósito diferente na tabela hash. O valor original não será excluído e será levado em consideração ao enumerar ou solicitar à estrutura seu tamanho / contagem.
Isso pode levar a alguns bugs muito difíceis de localizar.
fonte
Aqui você pode encontrar uma comparação bastante completa das estruturas de dados
NSArray
eNSSet
.Conclusões curtas:
fonte
Normalmente, você usaria um Conjunto quando a velocidade de acesso fosse essencial e a ordem não importasse ou fosse determinada por outros meios (por meio de um predicado ou descritor de classificação). Core Data, por exemplo, usa conjuntos quando objetos gerenciados são acessados por meio de um relacionamento para muitos
fonte
Apenas para adicionar um pouco, eu uso set às vezes apenas para remover duplicatas da matriz como: -
fonte