Suppression des doublons de NSMutableArray
J'ai ce problème avec la suppression de dupliquer des objets à partir d'un tableau.
J'ai essayé ces déjà:
noDuplicates = _personalHistory.personalHistory;
for (int i=[noDuplicates count]-1; i>0; i--) {
if ([noDuplicates indexOfObject: [noDuplicates objectAtIndex: i]]<i)
[noDuplicates removeObjectAtIndex: i];
}
for (PersonalHistory_artikels *e in _personalHistory.personalHistory) {
if (![noDuplicates containsObject:e]) {
NSLog(@"Dubplicates");
[noDuplicates addObject:e];
}
}
for (i=0; i<_personalHistory.personalHistory.count; i++) {
PersonalHistory_artikels *test = [_personalHistory.personalHistory objectAtIndex:i];
for (j=0; j<_personalHistory.personalHistory.count; j++) {
PersonalHistory_artikels *test2 = [_personalHistory.personalHistory objectAtIndex:j];
if (! [test.nieuwsTITLE_personal isEqual:test2.nieuwsTITLE_personal]) {
NSLog(@"Add test = %@", test.nieuwsTITLE_personal);
[noDuplicates addObject:test];
}
}
}
Mais aucun de ce qui précède m'a donné le droit de tableau. Le dernier a été le meilleur, mais il a encore montré des valeurs en double. Quelqu'un peut-il m'aider avec ce problème?
Je vous remercie beaucoup.
Seriez-vous capable de nous montrer le
@interface
de votre PersonalHistory_artikels
classe?OriginalL'auteur user750079 | 2011-05-12
Vous devez vous connecter pour publier un commentaire.
Il suffit de convertir le tableau à une
NSSet
et de retour à nouveau. Un ensemble ne peut pas avoir des doublons de par leur conception.EDIT:
Notez qu'une série n'a pas un ordre de tri. Par conséquent, vous pouvez aller au moins cher et de renoncer à la commande, ou aller un peu plus coûteux, mais de garder la commande.
Oui, mais si vous allez supprimer les doublons d'un tableau, vous n'allez pas à la garantie de l'élément de commande parce que vous êtes soit de garder la première ou de la dernière instance de chaque élément.
Dépend de ce que l'affiche est en train de faire. Son tableau est appelé
history
, de sorte qu'il est très probable qu'il essaye de transformer quelque chose commeaaabbca
enabc
. C'est pourquoi les naïfs solution me semble mieux. Mais vous avez raison, le groupe peut faire, c'est juste serait bien de donner un avertissement à propos de l'élément résultant de la commande.Je l'ai essayé, mais j'ai eu un "Programme de signal reçu: “EXC_BAD_ACCESS”." message.
J'avais besoin de voir plus de code pour vous aider sur ce point.
OriginalL'auteur Alexsander Akers
Dans OS X 10.7 et iOS 5.0 et versions ultérieures:
Je dois avouer que je n'ai jamais réellement essayé. Pourriez-vous donner des précisions sur les circonstances dans lesquelles l'ordre n'est pas maintenu?
OriginalL'auteur hatfinch
Si vous voulez maintenir votre commande, vous pourriez faire quelque chose comme ce
Cette solution a moindre complexité de calcul que la plupart des autres jusqu'ici proposé; pour un tableau de N éléments de M sont uniques, il devrait avoir les pires cas de complexité O(N log M), plutôt que de O(N^2). La plus simple des solutions pourrait être plus rapide pour les tableaux court, cependant, étant donné que cette méthode n'avons certaines de surcharge supplémentaire.
Bien sûr, il ne comptons sur votre
-isEqual:
et-hash
méthodes mises en œuvre correctement.J'ai mis à jour le code pour prendre en compte cette idée, car je pense que je suis d'accord avec vous que c'est mieux. Il est intéressant de noter, en inversant le sens de l'ensemble n'est éviter d'avoir à créer un ensemble complet d'objets à l'avant, même si cela signifie également que vous ne pouvez pas tester pour la réalisation de facilement; cependant, puisque le jeu avait déjà itération à l'ensemble de la matrice, qui n'était probablement pas une victoire de toute façon.
fonctionne à merveille...génial
OriginalL'auteur alastair
Comment de cette catégorie?
Vous pouvez l'utiliser comme ceci:
Dans ce cas, vous pourriez avoir des problèmes avec la vérification de l'égalité, voir octy de réponse. (Êtes-vous sûr de la source de tableau n'était pas
nil
?)Cela a une complexité O(N^2), depuis
-containsObject:
est O(N). C'est le temps pris pour exécuter cette méthode augmente avec le carré de la longueur du tableau (ce qui est très mauvais).Bonne suggestion. Ce ne sera probablement pas un problème jusqu'à ce qu'il y a plusieurs centaines d'articles (finitions en 0.03 s pour 1000 généré de façon aléatoire sur les cordes de mon iMac), mais c'est bon à savoir.
Salut, j'ai essayé cette option: mais j'ai reçu un avertissement: NSMutableArray ne peut pas répondre à removeDuplicates. (Je l'ai essayé avec un NSArray aussi).
OriginalL'auteur zoul
Je pense que votre problème réside dans la façon de définir l'égalité de votre
PersonalHistory_artikels
objets.Indépendamment de l'algorithme permet de supprimer les doublons dans un tableau, assurez-vous de prévoir suffisamment de
-isEqual:
et-hash
les implémentations de méthode. Voir la La documentation d'Apple pour ces deux méthodes, en particulier ce paragraphe:Espère que cette aide.
OriginalL'auteur octy
OriginalL'auteur Saurabh
Meilleure façon de supprimer les doublons d'élément de tableau:
OriginalL'auteur Rahul Miglani
Pas besoin de créer NSSet ou quoi que ce soit d'autre.
Essayez cette
OriginalL'auteur goce
Pour tableau qui contient les objets personnalisés:
PS: _pSessionArr est le nom de la mutable tableau qui contient une classe personnalisée d'objets qui ont la propriété titre.
OriginalL'auteur pkc456