我大致分为两种:
- 数组里都是基本数据类型
- 数组里放的都是自定义的对象类型
关于第一种的合并去重:看这个就够了 | 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 协议的,所以在数组个数不是很大,且不钻牛角尖的情况下是可以工作的,毕竟问题也是相对来说的嘛
最后,希望有更好的思路的同学可以指点一下
网友评论