1

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

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
)

但是,如果我想检索消息,我该怎么做呢?我只想要像 take 之类的东西(也许重建一个 nsarray)

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

谢谢。

4

2 回答 2

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,它也会被泄露。

于 2012-05-27T01:52:15.973 回答
0

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

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

于 2012-05-26T22:43:15.367 回答