仅保留数组中的唯一值

时间:2013-05-10 11:52:15

标签: ios objective-c

我有一个字符串数组。我只需保留唯一值,即。我想删除所有复制品。例如:如果数组是{string1,string1,string1,string2,string3,string3},那么最后一个数组应该是{string1,string2,string3}

for(int p = 0; p < [allNewsDates count]; p++)
    {
        NSLog(@"%@",allNewsDates[p]);
        for(int q = p+1; q < [allNewsDates count]; q++)
        {
            NSLog(@"%@   %@",allNewsDates[p],allNewsDates[q]);
            if([allNewsDates[p] isEqualToString:allNewsDates[q]])
            {
                flag = YES;
                t = q;

                break;

            }
        }
        if(flag)
        {
            //[self.date addObject:allDates[p]];


            [allNewsDates removeObjectAtIndex:p];
            NSLog(@"%i",[allNewsDates count]);
        }

        NSLog(@"%i",p);
        flag = NO;
    }

我按照上述步骤从所有日期的数组中提取唯一日期。 这通常可行。但问题是:我有一个新闻视图控制器,显示新闻提要。如果用户在那里选择任何新闻,则会将其添加到收藏夹中。如果我一次性选择所有新闻项目,那么收藏夹表格会根据日期显示新闻(不同的日期会出现在5月9日和10日),但如果我添加新闻,请转到收藏夹,然后返回新闻并点击一些新闻项目(例如5月10日)并再次访问收藏夹,然后我将于5月10日两次收到。我哪里错了?请帮忙!!

4 个答案:

答案 0 :(得分:6)

将您的数组添加到 NSSet ,就是这样

NSSet *mySet = [[NSSet alloc] initWithArray:allNewsDates];
NSArray *filteredArray = [mySet allObjects];

答案 1 :(得分:6)

您可以简单地使用KVC集合运算符:

NSArray* uniqueDates = [allNewDates valueForKeyPath:@"@distinctUnionOfObjects.self"] 

此处有更多详情:http://www.nshipster.com/kvc-collection-operators

答案 2 :(得分:3)

NSSet *uniqueStates = [NSSet setWithArray:yourArray];
NSArray *arr = [uniqueStates allObjects];

答案 3 :(得分:0)

以下是从NSMutable Array中删除重复值的代码..这对您有用。 myArray是你想要删除重复值的可变数组..

for(int j = 0; j < [myArray count]; j++){
    for(int k = j+1;k < [myArray count];k++){
        NSString *str1 = [myArray objectAtIndex:j];
        NSString *str2 = [myArray objectAtIndex:k];
        if([str1 isEqualToString:str2])
            [myArray removeObjectAtIndex:k];
       }
}

或者您可以使用:

NSSet正是您正在尝试做的事情:它是一个(无序的)唯一项集合。因此,您可以在数组中找到唯一的项目,如下所示:

NSSet *uniqueElements = [NSSet setWithArray:myArray];
// iterate over the unique items
for(id element in uniqueElements) {
  // do something
}