查找 NSArray 中所有重复元素的索引

Posted

技术标签:

【中文标题】查找 NSArray 中所有重复元素的索引【英文标题】:Find index of all duplicate elements in NSArray 【发布时间】:2015-02-24 06:20:07 【问题描述】:

很难解释为什么我需要数组中重复元素的索引。当我尝试以传统方式获取元素的索引时,它只显示一个索引,但我需要获取重复值的所有索引 例如:

NSArray *array=@[@"one",@"one",@"one",@"two",@"two",@"four",@"four",@"four"];
int index = [array indexOfObject:element];
NSLog(@"index %d",index);

如果我尝试获取“one”的索引,则显示索引为 0,但我需要获取one 的更多索引

【问题讨论】:

你希望所有索引作为匹配索引或单个索引的数组。 【参考方案1】:

您可以像这样获取重复项的索引:

NSArray *array=@[@"one",@"one",@"one",@"two",@"two",@"four",@"four",@"four"];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
 
     if ([obj isEqualToString:@"one"])
     
         NSLog(@"index %d",idx);

     
 ];

【讨论】:

【参考方案2】:
int i,count=0;
for (i = 0; i < [array count]; i++) 
    if element == [array objectAtIndex:i] 
        indices[count++] = i;
    

声明一个空数组索引,索引将包含给定元素的所有索引。

【讨论】:

【参考方案3】:
NSString *element = @"one";
NSArray *array=@[@"one",@"one",@"one",@"two",@"two",@"four",@"four",@"four"];

NSIndexSet *matchingIndexes = [array indexesOfObjectsPassingTest:^BOOL(NSString *obj, NSUInteger idx, BOOL *stop) 
    return [obj isEqual:element];
];

[matchingIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) 
    NSLog(@"%ld", (long)idx);
];

【讨论】:

【参考方案4】:

最终,我认为 NSArray 方法在这方面对您没有帮助,因此您将不得不编写一些非常基本的代码。可能有一个更清晰的答案,但这是一个相当简单的问题解决方案。

这只是遍历数组,并为每个唯一数字创建一个 NSDictionary。它假定数组按照您的示例进行排序,因此只需根据当前索引检查先前索引的值以查看它们是否已更改。当它们发生变化时,它知道它已经完成了该值并将字典保存到一个数组中。

NSArray *array=@[@"one",@"one",@"one",@"two",@"two",@"four",@"four",@"four"];
NSString *priorString = array[0];
NSMutableDictionary *duplicatesByKey = [[NSMutableDictionary alloc] init];
NSMutableArray *indexesOfDuplicates = [[NSMutableArray alloc] init];

int index = 0;
for (NSString *string in array) 
    if ([priorString isEqualToString:string]) 
        [indexesOfDuplicates addObject:[NSNumber numberWithInt:index]];
     else 
        [duplicatesByKey setObject:indexesOfDuplicates forKey:priorString];
        indexesOfDuplicates = [[NSMutableArray alloc] init];
        [indexesOfDuplicates addObject:[NSNumber numberWithInt:index]];
    
    priorString = string;
    index ++;

[duplicatesByKey setObject:indexesOfDuplicates forKey:priorString];

希望对你有帮助。

【讨论】:

【参考方案5】:

使用

NSCountedSet * countedSet = [NSCountedSet setWithArray: array];

NSSet * uncountedSet = [NSSet setWithArray: array];

-- 从你的数组中创建一个计数集,以及一个常规的 NSSet。

然后:

[countedSet minusSet: uncountedSet];

countedSet 现在将只包含重复元素(如果有),并且 countForObject: 方法将返回该元素的重复数(超过 1)。

【讨论】:

以上是关于查找 NSArray 中所有重复元素的索引的主要内容,如果未能解决你的问题,请参考以下文章

NSArray 查找值的索引

查找列表中元素的索引[重复]

编写在数字数组中查找元素索引的函数[重复]

查找重复元素的索引[重复]

在数组中查找具有更大索引但数组中值较小的元素[重复]

查找第二次出现索引最低的第一个重复元素