我大致分為兩種:
- 數(shù)組里都是基本數(shù)據(jù)類型
- 數(shù)組里放的都是自定義的對象類型
關(guān)于第一種的合并去重:看這個就夠了 | distinctUnionOfObjects的使用
關(guān)于第二種:我目前沒有找到合適的法子
只能是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 這三個對象,其實(shí)他們的地址指針的值都不同,也就是說,他們本來就是三個不同的對象,但是問題來了.
message0和message 這兩個對象的值其實(shí)是一樣的,這就是我說的第二種合并去重,并且我判斷是否是相同對象的條件還比較惡心,用兩個屬性一起判斷
NSArray *aArray = @[message0,message2];
NSArray *bArray = @[message];
我們現(xiàn)在要做的是把a(bǔ)Array bArray這兩個數(shù)組合并去重
最后期望得到一個cArray數(shù)組 ,里面存放的是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(@"最后得到的數(shù)組:===> %@",newArr);
這種方式會有兩個for-in 操作,第一個是間接的給每一個對象加一個key,然后利用NSDictionary 的::allKeys:: 去重.第二個循環(huán)操作是得到我們?nèi)ブ睾蟮膶ο髷?shù)組.其中一共循環(huán)了(aArray.count + aArray.count + 不重復(fù)元素個數(shù))次,其實(shí)也還好
方案二:
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];
}
}
}
這種方式就有點(diǎn)傻X了,for-in 嵌套的使用.循環(huán)次數(shù)大于(aArray.count * aArray.count)…我沒有使用這個
總結(jié)
對于這種對象的去重,我目前還沒有找到合適的法子
只能是繞著解決問題.在數(shù)組的count很大的時(shí)候,就會有問題的.好在OC 里面Array Dictionary 和 Set 都是有實(shí)現(xiàn)NSFastEnumeration 協(xié)議的,所以在數(shù)組個數(shù)不是很大,且不鉆牛角尖的情況下是可以工作的,畢竟問題也是相對來說的嘛
最后,希望有更好的思路的同學(xué)可以指點(diǎn)一下