如何从NSMutableArray获取唯一内容?

时间:2014-11-07 11:57:49

标签: ios objective-c nsmutablearray nsset

我有一个UITableView并且正在显示来自我的NSMutableArray的内容。以下是数组格式

 (
  {

        Name = "ANS";
        VersionNo = 6;

    },
        {

        Name = "O-Hydro";
        Version = 6;

    },
        {

        Name = "ANS";
        Version = 6;

    },
        {

        Name = "ANTIChorosAnticholinergic";
        Version = 6;

    }
)

由此我需要只显示唯一的"姓名" (就像在这里我可以看到2" ANS"我只需要一个)。

我该如何在iOS中执行此操作?

我试过跟随,但它无法正常工作

uniqueArray= [[NSMutableSet setWithArray: groupDetails] allObjects];

但是这样我只能为NSArray而不是NSMutableArray。

请帮助我

3 个答案:

答案 0 :(得分:0)

您可以使用以下代码行将NSArray转换为NSMutableArray,

NSArray *uniqueArray= [[NSMutableSet setWithArray:groupDetails] allObjects];
NSMutableArray *myMutableArray = [[NSMutableArray alloc] initWithArray:uniqueArray];

答案 1 :(得分:0)

如果您只想要一系列独特的name值,则可以@distinctUnionOfObjects使用valueForKeyPath -

NSArray *uniqueArray=[groupDetails valueForKeyPath:@"@distinctUnionOfObjects.name"];

但是如果你想让数组包含对应于唯一名称的字典,那么你需要做更多的工作 -

NSMutableArray *uniqueArray=[NSMutableArray new];
NSMutableSet *nameSet=[NSMutableSet new];

for (NSDictionary *dict in groupDetails) {
    NSString *name=dict[@"name"];
    if (![nameSet containsObject:name]) {
        [uniqueArray addObject:dict];
        [nameSet addObject:name];
    }
}

答案 2 :(得分:0)

您只需添加mutableCopy即可。

但等等,在你做之前。数组和集合有两个差异:

  1. 数组可以包含重复项,但不能包含。
  2. 数组是有序的,而不是。
  3. 所以做你正在做的事情,你会丢失重复(故意),但也会失去顺序(可能不是故意的)。

    我不知道,这对你来说是否重要,但对于其他读者来说可能是这样。因此,使用NSOrderedSet代替NSSet

    ,这是更好的方法
    NSOrderedSet *uniqueList = [NSOrderedSet orderedSetWithArray:array];
    

    在许多情况下,有序集合正是您想要的。 (可能它从一开始就是NSArray的使用是错误的。但有时你得到一个数组。)如果你真的想在一天结束时使用一个数组,你可以重新转换它:

    array = [uniqueList.array mutableCopy];