2015-01-16 34 views
0

我有一個包含多個對象的數組(itemArray)。這些對象中的每一個(我們稱之爲item對象)都有一個包含項目標識符的屬性,該項目標識符告訴它是什麼類型的項目。我們會打電話給那個IID如何從包含同一對象的多個實例的數組中獲取不同的對象

現在,用戶要使用的應用程序來的item實例添加到itemArray是,且用戶可添加幾個相同實例(例如,4個item s,各爲3的IID)。最後,itemArray將包含可疑數百個item的實例,並且這些實例將以不特定的順序添加,並且可能有幾個實例與陣列中的其他實例相同(4個item s,IID爲3, 2 item s與IID等等6等)。

我需要創建一個數組(我們稱之爲tempArray),該數組可以基於IID給出數組中對象的摘要。我不需要在itemArray中計算每種類型的對象,我只需要在itemArray中爲item的每種類型添加item的一個實例到tempArray

因此,舉例來說:

如果我itemArray看起來是這樣的:

item.IID = 4 
item.IID = 3 
item.IID = 4 
item.IID = 6 
item.IID = 4 
item.IID = 5 
item.IID = 6 
item.IID = 3` 

然後,我需要tempArray太像這樣:

item.IID = 4 
item.IID = 3 
item.IID = 6 
item.IID = 5 

tempArray只是顯示了各種itemArray中的對象基於IID

在此先感謝!

+0

所以你不是真的試圖排序?並且是IID產品的唯一財產? –

+0

我不是想排序,所以也許問題標題有點誤導。我只是想獲得tempArray來表示itemArray中的各種項目。他們進來的順序並不重要。而物品除了IID還有其他屬性。 – JayB127

回答

1

如果我正確地理解了你,我會使用NSDictionary解決這個問題,並且只有當密鑰不存在時纔會插入一個項目(item.iid是字典的關鍵字)。

你可以問字典是否有對象或者它有密鑰,兩者都可以。

+1

此外,字典可以返回它包含的所有鍵('allKeys')以及它包含的所有值('allValues')作爲'NSArray'實例。 –

0

也許你可以從你的數組中創建NSSet,然後從NSSet創建NSArray。

NSSet * tempSet = [NSSet setWithArray:yourArray]; NSArray * tempArray = [tempSet allObjects];

2

如果你可以假設一個item等於另一個item根據自己IID S,我將實現isEqual方法檢查IID S(返回YES如果它們是相同的),然後使用一個NSSet得到「已過濾」列表(一旦您在評論中提到訂單對您不重要)。就像這樣:

@implementation YourItem 

- (BOOL)isEqual:(id)object 
{ 
    if (self != object) 
     return NO; 

    if (![self.class isKindOfClass:[object class]]) 
     return NO; 

    return self.IID == object.IID; 
} 

@end 

正如想起由@jlehr,你需要重寫- (NSUInteger)hash了。您可以通過implemeting像這樣做:

- (NSUInteger)hash 
{ 
    /* every property that will make it equals to another object */ 
    return [self.IID hash]^[self.name hash] /* ...^*/; 
} 

(目前由Mike灰全部細節平等和散列解釋寫的great post

然後......

NSSet *tempSet = [NSSet setWithArray:itemArray]; 

如果你想再次將它轉換爲NSArray

NSArray *tempArray = [tempSet allObjects]; 
+0

您可能想更新您的答案,指出在重寫'isEqual:'時,您還必須重寫'hash'。 – jlehr

+0

感謝記得我@jlehr –

相關問題