【iOS】 数组合并去重 distinctUnionOfObjects的使用

我大致分为两种:

  1. 数组里都是基本数据类型
  2. 数组里放的都是自定义的对象类型

关于第一种的合并去重:看这个就够了 | distinctUnionOfObjects的使用

关于第二种:我目前没有找到合适的法子
只能是for-in 这种操作了

    RCTextMessage *textContent0 = [RCTextMessage messageWithContent:@"123"];
    RCMessage *message0 = [[RCMessage alloc]initWithType:self.conversationType targetId:self.targetId direction:0 messageId:3 content:textContent0];
    message0.sentTime = 123456;
    message0.senderUserId = @"123456789";
    message0.content = textContent0;
    
    RCTextMessage *textContent = [RCTextMessage messageWithContent:@"123"];
    RCMessage *message = [[RCMessage alloc]initWithType:self.conversationType targetId:self.targetId direction:0 messageId:3 content:textContent];
    message.sentTime = 123456;
    message.senderUserId = @"123456789";
    message.content = textContent;
    
    RCImageMessage *imageMessage = [RCImageMessage messageWithImage:[UIImage imageNamed:@"genderSelected"]];
    imageMessage.imageUrl = @"https://oss-cn-shanghai.aliyuncs.com/2018/06/08/2d0dc5d47d78475ca11e10257d279f65.jpg";
    RCMessage *message2 = [[RCMessage alloc]initWithType:self.conversationType targetId:self.targetId direction:0 messageId:3 content:textContent];
    message2.sentTime = 654321;
    message2.senderUserId = @"987654321";
    message2.content = imageMessage;

可以看到message0,message2,message 这三个对象,其实他们的地址指针的值都不同,也就是说,他们本来就是三个不同的对象,但是问题来了.
message0和message 这两个对象的值其实是一样的,这就是我说的第二种合并去重,并且我判断是否是相同对象的条件还比较恶心,用两个属性一起判断

   NSArray *aArray = @[message0,message2];
   NSArray *bArray = @[message];

我们现在要做的是把aArray bArray这两个数组合并去重
最后期望得到一个cArray数组 ,里面存放的是message2 、(message和message0其中一个)

我是这么做的

方案一:

    NSMutableDictionary *dic = [NSMutableDictionary new];
    for (RCMessage *localObj in localMessages) {
        [dic setObject:localObj forKey:[NSString stringWithFormat:@"%@%lld",localObj.senderUserId,localObj.sentTime]];
    }
    NSArray *keyArray = [dic allKeys];
    for (NSString *key in keyArray) {
        [newArr addObject:[dic objectForKey:key]];
    }

NSLog(@"最后得到的数组:===>  %@",newArr);

这种方式会有两个for-in 操作,第一个是间接的给每一个对象加一个key,然后利用NSDictionary 的::allKeys:: 去重.第二个循环操作是得到我们去重后的对象数组.其中一共循环了(aArray.count + aArray.count + 不重复元素个数)次,其实也还好

方案二:

    for (RCMessage *localObj in localMessages) {

        for (RCMessage *historyObj in messages) {
            if (![localObj.senderUserId isEqualToString:historyObj.senderUserId] || localObj.sentTime != historyObj.sentTime) {
                [newArr addObject:historyObj];
            }
        }
        for (RCMessage *newObj in newArr) {
            if (![localObj.senderUserId isEqualToString:newObj.senderUserId] || localObj.sentTime != newObj.sentTime) {
                [newArr addObject:localObj];
            }
        }
    }

这种方式就有点傻X了,for-in 嵌套的使用.循环次数大于(aArray.count * aArray.count)…我没有使用这个

总结

对于这种对象的去重,我目前还没有找到合适的法子
只能是绕着解决问题.在数组的count很大的时候,就会有问题的.好在OC 里面Array Dictionary 和 Set 都是有实现NSFastEnumeration 协议的,所以在数组个数不是很大,且不钻牛角尖的情况下是可以工作的,毕竟问题也是相对来说的嘛

最后,希望有更好的思路的同学可以指点一下

你可能感兴趣的:(【iOS】 数组合并去重 distinctUnionOfObjects的使用)