【iOS】 數(shù)組合并去重 distinctUnionOfObjects的使用

我大致分為兩種:

  1. 數(shù)組里都是基本數(shù)據(jù)類型
  2. 數(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)一下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容