2013-07-01 65 views
1

嗨,在我的一個應用程序中,我有一個包含一組NSMutableDictionary對象的數組。字典對象有三個鍵 - 值對如像下面如何避免NSMutableArray中的重複字典對象

  1. 公司
  2. 產物

AND陣列具有許多數目的對象。現在通過使用不同的添加按鈕,我將這些字典對象添加到數組中。即使在向數組添加對象時,我正在使用NSNotFound方法檢查是否有任何重複的對象可用。因此下面

if([Array indexOfObject:dicObject] == NSNotFound) 
{ 
     [Array addObject:dicObject]; 
} 

這是工作在少數情況下很好,但它不是在其他工作辦案。將一個例子來解釋:

  1. 例如,我有一個數組與dicobject以下鍵值對

    company:XYZ Product:ABC Quantity:2

現在比如我想添加一個與上面的鍵值對相同​​的多個dic對象。這一次顯然它不會被添加,因爲已經有相同的產品在陣列中可用。

這是有效的條件。

例外情況:例如,我想添加多一個產物與下面的值

Company:XYZ Product:ABC Quantity:6 

在這種情況下,此產品是添加到陣列中沒有任何錯誤。但我擔心的是我不想再把這個加到數組中只有數量有更新,因爲公司和產品名稱都是一樣的。所以你可以告訴我處理這種情況的方法。

+0

嗨Rushabh謝謝你的回覆。實際上,我需要避免重複在數組中不在dictionary.My數組有字典對象。 – Naresh

+0

嘿,你有沒有嘗試過NSSet或NSOrderedSet,它們都不允許重複,並且可以很容易地從數組轉換爲數組。 [NSSet Doc](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSet_Class/Reference/Reference.htmlt) – BooRanger

回答

5

您可以使用indexOfObjectPassingTest:來知道數組中是否存在類似的字典。

這可能是這個樣子:

NSMutableArray *arr = // your array 
NSDictionary *dicObject = // your object 

NSUInteger indexOfDicObject = [arr indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) 
{ 
    return ([obj[@"company"] isEqualToString:dicObject[@"company"]] && 
      [obj[@"product"] isEqualToString:dicObject[@"product"]]); 
}]; 

if (indexOfDicObject == NSNotFound) 
{ 
    [arr addObject:dicObject]; 
} 
else 
{ 
    NSNumber *quantity = arr[indexOfDicObject][@"quantity"]; 
    arr[indexOfDicObject][@"quantity"] = @([quantity intValue] + [dicObject[@"quantity"] intValue]); 
} 

我做出以下假設:

  • company值是NSString;
  • product值是NSString;
  • quantity值是一個整數,存儲在NSNumber中。

另請參閱trojanfoe's answer,如果您可以按類替換字典,則更好。

+0

非常好,乾淨的解決方案!我不知道這種方法! +1 – HAS

+0

嗨Guillaume阿爾吉斯感謝您的回覆您的答案是一些什麼幫助我。 – Naresh

+0

偉大的解決方案。它完全爲我工作。 – Mani

3

我認爲你需要改變方向;首先創建一個自定義對象來保存公司,產品和數量,並確保實施isEqual:hash方法。

然後只需將您的自定義對象存儲在NSMutableSet對象中,這將確保重複項不能存在。

您的自定義對象現在將成爲您的應用程序的原則模型對象(即提供'M'在MVC,Cocoa和Cocoa Touch應用程序基於的設計模式),您會發現它將被重用並隨着應用程序的增長而結束。

+0

我喜歡這種方法,因爲一旦自定義對象是編寫代碼應該看起來很簡單。但是,當對象具有相同的「公司」和「產品」時,他還需要包含一種「自動」添加「數量」屬性的方法。 –

+1

@boyfarrell這不是一種忽略'isEqual:'比較中的數量,並且在添加它之前檢查對象是否存在的情況(在這種情況下,他會更新數量,如果是的話)?但我不認爲這可以「自動」完成。 – trojanfoe

+0

我喜歡這個,這看起來很優雅。但是,它可能需要更改gadamsetty的更多代碼。 –