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

时间:2015-02-24 06:20:08

标签: ios objective-c nsarray

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

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

如果我尝试获取"的索引one"它显示索引 0 但我需要获得one

的更多索引

5 个答案:

答案 0 :(得分:2)

你可以像这样获取重复索引:

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);

     }
 }];

答案 1 :(得分:2)

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);
}];

答案 2 :(得分:1)

int i,count=0;
for (i = 0; i < [array count]; i++) {
    if element == [array objectAtIndex:i] {
        indices[count++] = i;
    }
}

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

答案 3 :(得分:1)

最终我不认为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];

我希望有所帮助。

答案 4 :(得分:0)

使用

NSCountedSet * countedSet = [NSCountedSet setWithArray: array];

NSSet * uncountedSet = [NSSet setWithArray: array];

-- 从你的数组和一个传统的 NSSet 创建一个计数集。

那么:

[countedSet minusSet: uncountedSet];

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