第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

目標C中從NSMutableArray中刪除重復值的最佳方法-C?

目標C中從NSMutableArray中刪除重復值的最佳方法-C?

iOS
拉風的咖菲貓 2019-07-17 09:34:14
目標C中從NSMutableArray中刪除重復值的最佳方法-C?刪除重復值的最佳方法(NSString)來自NSMutableArray目標-C?這是最簡單和正確的方法嗎?uniquearray = [[NSSet setWithArray:yourarray] allObjects];
查看完整描述

3 回答

?
jeck貓

TA貢獻1909條經(jīng)驗 獲得超7個贊

我知道這是一個老問題,但是在NSArray 如果你不關心命令.

如果我們用來自鍵值編碼的對象運算符我們可以這樣做:

uniquearray = [yourarray valueForKeyPath:@"@distinctUnionOfObjects.self"];

安托巴還注意到,可以根據(jù)屬性刪除重復項。例如:@distinctUnionOfObjects.name


查看完整回答
反對 回復 2019-07-17
?
呼喚遠方

TA貢獻1856條經(jīng)驗 獲得超11個贊

是的,使用NSSet是一種明智的方法。

為了補充Jim Puls的回答,這里有一種在保留訂單的同時剝離副本的替代方法:

// Initialise a new, empty mutable array NSMutableArray *unique = [NSMutableArray array];for (id obj in originalArray) {
    if (![unique containsObject:obj]) {
        [unique addObject:obj];
    }}

它基本上與Jim的方法相同,但將唯一項復制到一個新的可變數(shù)組中,而不是從原始數(shù)組中刪除重復項。這使得在具有大量重復(不需要復制整個數(shù)組的副本)的大型數(shù)組的情況下,它的內(nèi)存效率略高一些,而且在我看來,它的可讀性更高一些。

請注意,在任何一種情況下,都要檢查目標數(shù)組中是否已經(jīng)包含了項(使用containsObject:在我的例子中,或者indexOfObject:inRange:(在Jim‘s中)不能很好地擴展到大型數(shù)組。這些檢查在O(N)時間內(nèi)運行,這意味著如果將原始數(shù)組的大小增加一倍,那么每張支票要跑兩倍的時間。由于您正在對數(shù)組中的每個對象進行檢查,您還將運行更多的這些更昂貴的檢查。整個算法(我的和Jim的)運行在O(N)中2)時間,隨著原始數(shù)組的增長,時間很快就會變得昂貴。

要將其降到O(N)時間,您可以使用NSMutableSet存儲已添加到新數(shù)組中的項的記錄,因為NSSet查找是O(1)而不是O(N)。換句話說,無論集合中有多少元素,檢查一個元素是否是NSSet的成員都需要相同的時間。

使用這種方法的代碼如下所示:

NSMutableArray *unique = [NSMutableArray array];NSMutableSet *seen = [NSMutableSet set];for (id obj in originalArray) {
    if (![seen containsObject:obj]) {
        [unique addObject:obj];
        [seen addObject:obj];
    }}

不過,這看起來還是有點浪費;當問題表明原來的數(shù)組是可變的時,我們?nèi)匀辉谏梢粋€新數(shù)組,因此我們應該能夠將它降到適當?shù)奈恢茫⒐?jié)省一些內(nèi)存。就像這樣:

NSMutableSet *seen = [NSMutableSet set];NSUInteger i = 0;while (i < [originalArray count]) {
    id obj = [originalArray objectAtIndex:i];

    if ([seen containsObject:obj]) {
        [originalArray removeObjectAtIndex:i];
        // NB: we *don't* increment i here; since
        // we've removed the object previously at
        // index i, [originalArray objectAtIndex:i]
        // now points to the next object in the array.
    } else {
        [seen addObject:obj];
        i++;
    }}

更新Yuri Niyazov指出我的最后一個答案實際上是O(N)2)因為removeObjectAtIndex:可能在O(N)時間內(nèi)運行。

(他說“可能”是因為我們不確定它是如何實現(xiàn)的;但一個可能的實現(xiàn)是,在刪除索引X處的對象之后,該方法循環(huán)遍歷從索引X+1到數(shù)組中的最后一個對象的每個元素,然后將它們移動到前一個索引。如果是這樣的話,那就是O(N)的性能。

那么,該怎么辦呢?這要視情況而定。如果你有一個很大的數(shù)組,而且你只需要少量的重復,那么就地去復制就可以正常工作了,這樣你就不必構建一個重復的數(shù)組了。如果您有一個數(shù)組,您需要大量的重復,那么構建一個單獨的、去欺騙的數(shù)組可能是最好的方法。這里的方法是,大O表示法只描述一個算法的特性,它不會確切地告訴你哪種方法對任何給定的情況都是最好的。


查看完整回答
反對 回復 2019-07-17
  • 3 回答
  • 0 關注
  • 662 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號