在NSSET中添加多个值

时间:2012-05-26 21:56:13

标签: iphone xcode nsmutablearray nsset

我有一个包含以下内容的可变数组:

2012-05-26 23:38:09.606 [8147:f803] log (
        {
        send = david;
        receive = mike;
        message = test me;
    },
        {
        send = david;
        receive = daddy;
        message = test me;

    },
        {
        send = david;
        receive = daddy;
        message = test me;

    }
)

我发现像这样的重复值:

NSSet *uniquearray = [[NSSet alloc] init];
uniquearray = [[NSSet setWithArray: myArray] valueForKey:@"receive"];

2012-05-26 23:38:09.609  [8147:f803]  log (
    mike,
    daddy
)

但是,如果我想要检索消息我怎么能这样做?我只想要像拿(可能重建一个nsarray)

这样的东西
2012-05-26 23:38:09.609 [8147:f803]  log (
   {
       receive = mike,
       message = test me;
},
{
       receive = daddy
       message = test me;
})

感谢。

2 个答案:

答案 0 :(得分:3)

你需要澄清你对自己想要什么的看法。例如,如果给“爸爸”的两条消息有不同的内容怎么办?你想要哪一个?或者你想保留两者吗?

如果您想保留所有独特的消息而不关心订单,您可以这样做:

NSSet* uniqueSet = [NSSet setWithArray:myArray];

如果您需要iOS 5.0或更高版本,则可以使用NSOrderedSet保留订单:

NSOrderedSet* uniqueSet = [NSOrderedSet orderedSetWithArray:myArray];

如果您只想保留每个接收者的一条消息,您可以这样做:

NSMutableArray* uniqueArray = [NSMutableArray array];
NSMutableSet* seen = [NSMutableSet set];
for (NSDictionary* dict in myArray)
{
    NSString* receiver = [dict objectForKey:@"receiver"];
    if (![seen containsObject:receiver])
    {
        [uniqueArray addObject:dict];
        [seen addObject:receiver];
    }
}

另外,如果变量uniquearray不是数组而是集合,则不应将其命名。其次,这段代码:

NSSet *uniquearray = [[NSSet alloc] init];
uniquearray = [[NSSet setWithArray: myArray] valueForKey:@"receive"];

分配一个空集,然后抛弃指向它的指针,用指向不同集的指针替换指针。第一个对象完全被浪费了。如果你没有使用ARC,它也会被泄露。

答案 1 :(得分:0)

您可能想要使用NSDictionary,我知道您可以使用keysOfEntriesPassingTest或其他帮助您使用密钥的方法创建数组。

http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html