2011-03-12 47 views
1

大家好,我的NSArray包含這樣的重複(我不得不刪除重複)iPhone SDK:如何刪除重複的NSArray的

標題:父親節

標題:父親節

標題:父親節

標題:選舉日

標題:選舉日

標題:選舉日

標題:復活節

標題:復活節

標題:世界地球日

標題:世界地球日

標題:世界地球日

標題: Cinco de Mayo

標題:五月五日節

標題:五月五日節

標題:平安夜

標題:平安夜

標題:平安夜

標題:聖誕 標題:聖誕節 標題:聖誕節

我有隻保留一個名字而不需要其他重複。 我如何做到這一點請引導我有點清楚的解釋,來解決這個問題。 謝謝。

回答

7

如果你關心的排序,可以通過每個對象的舊陣列中創建一個新的可變數組,循環且僅當它不添加它存在:

NSMutableArray *uniqueItems = [NSMutableArray array]; 
for (id item in allItems) 
    if (![uniqueItems containsObject:item]) 
     [uniqueItems addObject:item]; 

如果不是,它是多少簡單,只需使用一組:

NSSet *uniqueItems = [NSSet setWithArray:allItems]; 
+1

我建議首先使用'NSSet'。 – 2011-03-12 07:39:14

+0

「關於訂購」解決方案的運行時複雜性不是很好。 NSArray的containsObject具有線性運行時複雜性,即它可能必須與數組中的每個項目進行比較。涉及存儲桶的解決方案(例如NSSet)爲您提供更好的性能。 – occulus 2011-03-13 19:36:40

+0

另外,他的輸入數組似乎是排序的(儘管OP沒有明確指定) - 所以你在這種情況下解決起來有點複雜。 – occulus 2011-03-13 19:37:48

0

見簡單的..

NSMutableArray *dateArray = [[NSMutableArray alloc]initWithObjects:@"December 29,2010", 
          @"December 28,2010", 
          @"December 22,2010", 
          @"December 22,2010", 
          @"December 22,2010",@"December 21,2010",@"December 28,2010",nil]; 

爲避免重複使用該...

NSSet *cleanedArray = [NSSet setWithArray:dateArray]; 
NSArray *array = [[NSArray alloc]initWithArray:[cleanedArray allObjects]]; 

for (int i=0; i<[array count]; i++) { 
    NSLog(@"The Given Array is %@",[array objectAtIndex:i]); 
} 
+0

NSSet在分配時不會奇蹟般地變成NSArray。它仍然是一個NSSet,所有使用它的NSArray方法都會導致崩潰。 – 2011-03-12 09:43:16

+0

你試過了嗎?添加'NSLog(@「第一個對象:%@」,[clearedArray objectAtIndex:0]);'給你的代碼。 – 2011-03-12 10:11:57

+0

k我同意ur點....這是簡單的方法得到。但在詢問他應該指定達特應不使用NSSET ....... – Splendid 2011-03-12 10:16:21

2

是你的NSArray,你想去除已經排序的?從你的問題來看似乎如此。在這種情況下,下面的代碼會做:

NSMutableArray *uniqueItems = [NSMutableArray array]; 

id lastSeenUniqueObject = nil; 

for (NSObject *item in allItems) { 
    if (![item isEqual:lastSeenUniqueObject]) { 
     [uniqueItems addObject:item]; 
     lastSeenUniqueObject = item; 
    } 
} 

這具有的N(即快)的運行時間複雜度,相比於(約)N^2 rpetrich的回答的複雜性。

如果知道數組的內容進行排序,你有兩個選擇:

A)只是排序,然後應用上述算法,這給n log n運行的複雜性(方法N多好^ 2仍然)

B)使用NSMutableSet來跟蹤已經看到的對象(或使用桶和散列)的任何其他數據結構。代碼將是這樣的:

NSMutableArray *uniqueItems = [NSMutableArray array]; 

NSMutableSet *seenItems = [NSMutableSet set]; 

for (NSObject *item in allItems) { 
    if (![seenItems containsObject:item]) { 
     [uniqueItems addObject:item]; 
     [seenItems addOBject:item]; 
    } 
} 

這也給了比N^2更好的運行時間。