2013-04-26 31 views
3

我想從我的排序數組中刪除任何重複...我想我可以用另一個問題的例子來做它,但事實證明,甚至沒有接近工作。從NSMutable陣列中刪除重複的valuse

它的一個非常可怕的嘗試,但它唯一的方法,我可以弄清楚如何比較NSMutableArray中單個項目(NSDictionary)的兩個元素。

這裏是我的代碼示例

我現在有一個排序的數組

NSArray *duplicatesRemovedArray = [sortedArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
     NSDictionary *dictA = a; 
     NSDictionary *dictB = b; 

     NSString *startYear1 = dictA[kStartYear]; 
     NSString *finishYear1 = dictA[kFinishYear]; 
     NSString *allYear1 = [NSString stringWithFormat:@"%@%@",startYear1, finishYear1]; 
     NSString *startYear2 = dictB[kStartYear]; 
     NSString *finishYear2 = dictB[kFinishYear]; 
     NSString *allYear2 = [NSString stringWithFormat:@"%@%@",startYear2, finishYear2]; 

     return [allYear1 compare:allYear2]; 

    }]; 

如果任何人有關於如何創建獨特的項目一個NSArray任何想法就是我所追求的,如果你能給我任何建議,代碼示例,將不勝感激

更新:我要指出,我的NSDictionary其內具有 另一個元素的ID ...

所以我不能只比較你列出的例子中的對象...這是我的一個疏忽。所以,用途不同的物體看起來像這樣

ID: 1234 
STARTYEAR: 1999 
FINISHYEAR: 2000 

,所以我需要一些幫助刪除對象衛生組織StartYear和FinishYear匹配其他物體開始和結束的一年。

+1

可能重複://計算器.com/questions/1025674/the-best-way-to-remove-duplicate-values-from-nsmutablearray-in-objective-c),http://stackoverflow.com/questions/3966592/removing-duplicates-in- nsarray,http://stackoverflow.com/questions/3882515/remove-duplicates-nsmutablearray,http://stackoverflow.com/questions/5978574/removing-duplicates-from-nsmutablearray,其中[others](https:// www ?.google.com /查詢q =站點:stackoverflow.com +除去+重複+ NSA rray)。 – 2013-04-26 00:21:45

+0

@JoshCaswell我遇到的問題是每個NSDictionary對象都有兩個元素的事實......我需要將我的方法基於這個事實。如果不是所有示例中的大多數都只顯示具有單個元素的數組,則換句話說一個日期值而不是檢查每個對象的兩個日期值 – 2013-04-26 01:51:43

回答

7

因此,如果我正確理解您的問題,您希望以一種方式篩選數組,如果有多個具有相同年份值的項目(但可能具有不同的ID),則結果中只包含其中一個項目。

一個簡單的方法就是迭代數組,在可變集合中收集已經看到的開始/結束年份,並且只有結果中包含項目(如果它們具有開始/結束的組合)一年,你還沒有添加。

NSArray *array = @[@{@"ID": @(1234), @"STARTYEAR": @(1999), @"FINISHYEAR": @(2001)}, 
        @{@"ID": @(1235), @"STARTYEAR": @(1999), @"FINISHYEAR": @(2001)}, 
        @{@"ID": @(1236), @"STARTYEAR": @(1999), @"FINISHYEAR": @(2000)}, 
        @{@"ID": @(1237), @"STARTYEAR": @(1999), @"FINISHYEAR": @(2000)}]; 

NSMutableArray *duplicatesRemoved = [NSMutableArray array]; 
NSMutableSet *seenYears = [NSMutableSet set]; 
for (NSDictionary *item in array) { 
    //Extract the part of the dictionary that you want to be unique: 
    NSDictionary *yearDict = [item dictionaryWithValuesForKeys:@[@"STARTYEAR", @"FINISHYEAR"]]; 
    if ([seenYears containsObject:yearDict]) { 
     continue; 
    } 
    [seenYears addObject:yearDict]; 
    [duplicatesRemoved addObject:item]; 
} 
NSLog(@"%@", duplicatesRemoved); 

在這個例子中,這將導致在這兩個項目:

{ FINISHYEAR = 2001; ID = 1234; STARTYEAR = 1999; } 
{ FINISHYEAR = 2000; ID = 1236; STARTYEAR = 1999; } 
的(HTTP [從NSMutableArray中在Objective-C刪除重複值的最佳方式是什麼?]
+0

是的,這正是我想要實現的..我現在就給你一個答案,讓你知道我是怎麼去的。 – 2013-04-26 03:36:42

+0

聖莫爾..它的工作。男人我已經多次回到這個問題上,希望在某一時刻,要麼我會理解並解決它,要麼有人會明白我在問什麼,並幫助我..非常感謝你......我超級讚賞你的幫助..哦,人..感覺非常好,讓我的方式有這個問題...謝謝一噸! – 2013-04-26 03:42:39

1

如果您不關心保存數組中項目的順序,那麼確保數組中對象不同的快捷方法是將數組轉換爲數組,然後返回數組。一組中的元素是獨特和無序的。

下面是一個例子:

NSArray *a = @[@"a", @"b", @"a", @"c", [NSString stringWithFormat:@"%@", @"a"]]; 
NSLog(@"a is: %@", a); 
NSSet *s = [NSSet setWithArray:a]; 
NSArray *b = [s allObjects]; 
NSLog(@"b is: %@", s); 

從上面看起來像輸出:

a is: (
    a, 
    b, 
    a, 
    c, 
    a 
) 
b is: {(
    b, 
    c, 
    a 
)} 

所以,b是含有選自a所有不同的對象陣列。一個較短的版本做同樣的事情是:

NSArray *a = @[@"a", @"b", @"a", @"c", [NSString stringWithFormat:@"%@", @"a"]]; 
NSArray *b = [[NSSet setWithArray:a] allObjects]; 

如果關心順序,那麼你有兩種選擇:使用上面的方法,並隨後重新排序的對象,或者使用不同的方法。如果您只希望對象保持排序狀態,那麼您當然可以對不同對象的結果數組進行排序以恢復排序的順序。或者,如果數組已排序,則可以使用排序會導致重複對象彼此相鄰的事實。因此,只需掃描將每個元素與後續元素進行比較的數組,並刪除第一個元素(如果它們相同)。

如果您需要保留一些無法計算的訂單,那麼您有點卡住了。您可以複製數組,將上述方法應用於副本,然後使用原始數組來幫助您恢復原始順序。

我需要一些幫助消除衛生組織StartYear和FinishYear比賽

對象,這是一個更復雜一些,但並不多。考慮通過排序我上面提到的刪除重複的方法。如果您使用startYearfinishYear作爲鍵對字典數組進行排序,則應該得到一個數組,其中具有相同開始和結束年份的對象將相鄰。也就是說,具有相同開始年份的所有對象將聚集在一起,並且在每個聚類中,具有相同完成年份的所有對象將聚集在一起。您可以使用-sortedArrayUsingDescriptors:輕鬆進行這種分類。你可以這樣做:

NSSortDescriptor *start = [NSSortDescriptor sortDescriptorWithKey:@"startYear" ascending:YES]; 
NSSortDescriptor *finish = [NSSortDescriptor sortDescriptorWithKey:@"finishYear" ascending:YES]; 
NSArray *sortedArray = [unsortedArray sortedArrayUsingDescriptors:@[start, finish]]; 

之後,按照上述步驟進行 - 掃描數組,比較每個項目與後續項目。如果他們是一樣的,什麼也不要做。如果它們不同,或者如果到達數組的末尾,則將該元素複製到一個新數組中(或將其索引添加到索引集或其他)。請注意,在掃描時修改相同的數組是一種創建錯誤的簡單方法(如果使用枚舉器或快速枚舉,則不得修改數組)。這就是爲什麼我建議將獨特的項目複製到一個新的陣列。

+0

我剛剛完成了一些閱讀,其中我看到你可以將對象作爲一個整體相互比較......我沒有叮叮噹噹的東西是可能的,在我原來的問題中我忽略了提到NSDictionary中的另一個元素,認爲它是基於關閉startYear finishYear刪除重複是沒有任何意義的。 看起來你已經提供了類似的解決方案,其中只有一兩分鐘,你的答案被提交之前我已經更新了我的問題定義臉我有一個獨特的元素值在我的NSDictionary .. – 2013-04-26 02:01:19

+0

哎呦..剛剛玩弄了周圍代碼..我沒有看到你的更新..現在要讀:) – 2013-04-26 02:39:17

+0

該死!你的引用「我需要一些幫助刪除StartYear和FinishYear匹配的對象」是完全正確的,但我的措辭是完全錯誤的......該死的它實際上應該是讀取我想刪除對象whos startYear並與其他對象完成匹配在數組中。換句話說,數組中的每個對象都是相互比較的,所以最後你有一個對象數組,並在數組中有獨特的開始結束年份對象。我非常希望這是有道理的。 – 2013-04-26 03:05:33