2013-01-25 99 views
1

好吧,我遇到了nsarray問題,它正在從nsdictionary中添加重複的對象。如何避免在NSArray中插入重複的對象?

情況是這樣的:我有一個plist文件和一個字典數組。每本詞典的關鍵是'codigo'和'var'。

我所做的是我檢查每個'var'值,如果它是< 0,並且它是'codigo','var'將使用NSAttributedStrings獲取顏色。

問題出現在我遍歷數組並將評估的'var'添加到新數組中。我得到最終數組中的重複對象。

編輯:方案從xlc0212的回答得出,並通過聊天幫助:

_timer = [NSTimer scheduledTimerWithTimeInterval:0.020 target:self 
             selector:@selector(time:) userInfo:nil repeats:YES]; 

NSDictionary *redAttrs = @{NSForegroundColorAttributeName:[UIColor redColor]}; 
NSDictionary *greenAttrs = @{NSForegroundColorAttributeName:[UIColor colorWithRed:0.118 green:0.506 blue:0.000 alpha:1.000]}; 
NSDictionary *orangeAttrs = @{NSForegroundColorAttributeName:[UIColor orangeColor]}; 

NSString *stringUm = @""; 
NSString *stringDois = @""; 
NSString *stringTres = @""; 


arrayAtivos = [[NSMutableOrderedSet alloc] init]; 
NSDictionary *item = [[NSDictionary alloc]init]; 

for (item in array){ 

    NSString *alfa = [item objectForKey:@"var"]; 

    float fltNumber = [alfa floatValue]; 

    if (fltNumber < 0) { 
     stringUm = [NSString stringWithFormat:@"%@ %.2f ",[item objectForKey:@"codigo"], fltNumber]; 
     int strLength = [stringUm length]; 
     attStr = [[NSMutableAttributedString alloc] initWithString:stringUm]; 
     [attStr setAttributes:redAttrs range:NSMakeRange(0,strLength)]; 

    } else if (fltNumber > 0) { 
     stringDois = [NSString stringWithFormat:@"%@ %.2f ",[item objectForKey:@"codigo"], fltNumber]; 
     int strLength = [stringDois length]; 
     attStr = [[NSMutableAttributedString alloc] initWithString:stringDois]; 
     [attStr setAttributes:greenAttrs range:NSMakeRange(0,strLength)]; 

    } else if (fltNumber == 0) { 
     stringTres = [NSString stringWithFormat:@"%@ %.2f ",[item objectForKey:@"codigo"], fltNumber]; 
     int strLength = [stringTres length]; 
     attStr = [[NSMutableAttributedString alloc] initWithString:stringTres]; 
     [attStr setAttributes:orangeAttrs range:NSMakeRange(0,strLength)]; 
    } 

    [arrayAtivos addObject:attStr]; 

} 
+0

arrayAtivos中的對象的順序是否重要? –

+0

@PeterM Nope !!! –

回答

8

NSMutableOrderedSet是你想要的。只需將NSMutableArray替換爲NSMutableOrderedSet並完成。

如果你想在濾鏡陣列,使用此

NSArray *array = // your array 
NSMutableArray *filteredArray = [[[NSOrderedSet alloc] initWithArray: array] mutableCopy]; 

更換

arrayAtivos = [NSMutableArray new]; 

與此

arrayAtivos = [[NSMutableOrderedSet alloc] init]; 

和改變arrayAtivos類型NSMutableOrderedSet

+0

好吧,但是做出這樣的改變,我還是必須在代碼的底部使用'if'語句嗎? –

+0

看來你的方法是在數組創建後,我需要解決方案之前..我需要生成沒有重複的數組。 –

+1

否。如果對象已經在集合中,則不會發生任何事情。順便說一句,'![attStr isEqual:attStr]'總是評估爲False,除了'attStr'爲零。 –

4

如果我理解這個正確的,你可以只將對象添加到陣列之前做了簡單的檢查:

if (![arrayAtivos containsObject:attStr]) { 
    [arrayAtivos addObject:attStr]; 
} 
+0

這已經在代碼中,它不起作用... –

+1

從您發佈的代碼中使用「isEqual」 – Firo

+0

做了更改,它返回了我這個錯誤:2013-01-24 21:26:33.298字符串[663:無法識別的選擇器發送到實例0x715ccd0 2013-01-24 21:26:33.298字符串[663:c07] ***終止應用程序,由於未捕獲異常'NSInvalidArgumentException',原因:' - [__ NSCFDictionary字符串]:無法識別的選擇發送到實例0x715ccd0' –

3

您可以將它們全部添加到不允許重複的NSSet。

你可以從中得到一個數組,但如果這很重要,你將負責對它們進行排序。

+0

我已經做到了,沒有成功..據我所知,這種方式是刪除重複項,我想要的是之前,我想避免插入重複的對象。 –