2015-10-30 181 views
0

我有這樣的代碼片斷,導致整個數組中包含一大堆「< null>」,我需要弄清楚如何刪除它們。很明顯,在將我的頭撞到鍵盤後,我正在尋求一些幫助。從對象中刪除空數組-c

在我的.h我宣佈:

NSArray *sortedContacts; 
NSArray *rawContacts; 

然後在.M:

-(void) buildContacts { 
    ABAddressBook *addressBook = [ABAddressBook sharedAddressBook]; 
    NSArray *contacts = [addressBook people]; 
    rawContacts=contacts; 

    NSArray *firstNames = [rawContacts valueForKey:@"First"]; 
    NSArray *lastNames = [rawContacts valueForKey:@"Last"]; 
    NSArray *organization = [rawContacts valueForKey:@"Organization"]; 

    NSMutableArray *fullNames = [NSMutableArray array]; 
    for(int i = 0; i < [firstNames count]; i++) 
    { 
     NSString *fullName = [NSString stringWithFormat:@"%@ %@ %@", 
           [firstNames objectAtIndex:i], 
           [lastNames objectAtIndex:i], 
           [organization objectAtIndex:i]]; 
     [fullNames addObject:fullName]; 
    } 

    NSMutableArray *fullList = [[NSMutableArray alloc]initWithArray:fullNames]; 

    [fullList removeObjectIdenticalTo: @"<null>"]; 

    sortedContacts = [fullList sortedArrayUsingSelector:@selector(compare:)]; 

    NSLog(@"%@",sortedContacts); 
} 

我試過這麼多東西,我只是不能看到的森林樹木了。

+0

可能重複http://stackoverflow.com/q/110332/2557145 – Palle

回答

3

文本<null>NSNull一個實例,該如何描述自己。也就是,-[NSNull description]返回。

反過來,這些NSNull對象進入你的firstNameslastNamesorganization的陣列,因爲這時候你的陣列上調用-valueForKey:和一些元素返回nil當上轉發該消息是什麼鍵 - 值編碼呢他們用同樣的鑰匙。也就是說,調用[rawContacts valueForKey:@"First"]會導致NSArrayrawContacts中的每個元素調用[element valueForKey:@"First"],並將結果放入其構建的數組中。但是,由於數組不能包含nil,如果其中一個元素從[element valueForKey:@"First"]返回nil,則會在其位置添加NSNull對象。

然後,您將從firstNameslastNamesorganization的相應元素格式化字符串fullName。您需要使用if ([value isKindOfClass:[NSNull class]])來檢查這些元素是否爲NSNull並處理。例如,你可能只是跳過那條記錄。或者你可以結合可用的字段並省去任何不可用的字段。

在任何情況下,fullList的元素都不會是@"<null>",因爲將值格式化爲@"%@ %@ %@"永遠不會導致該字符串。 (這可能是@"<null> <null> <null>"或類似的東西,但絕不只是@"<null>"

0

快速瀏覽一下你的代碼表明您不能得到任何空字符串添加到您的陣列,(a)您使用添加元素:

[NSString stringWithFormat:@"%@ %@ %@" ... 

[fullNames addObject:fullName]; 

fullName使用創建所以即使%@的被替換爲沒有任何東西,你仍然會有2個空格...

也許這就是爲什麼你嘗試過的所有東西都會失敗,如果你正在尋找空弦,你不會找到它們。

(附錄:問題現在說你正在尋找@"<null>",你不會得到,要麼出於同樣的原因 - 有你的字符串中的至少兩個空格。)

簡單的答案刪除fullNames中的無效條目不是要將它們添加到第一位。您正在循環中添加循環中的元素(for)和條件邏輯(例如if),以確定您是否有要添加的內容 - 但是您定義了「某些有效內容」 - 並且僅在fullNames中添加項目。

HTH

0

我不是很熟悉的通訊錄框架,但是這可能是什麼造成的混亂:你在收集

值的陣列firstNames,lastNamesorganization可以是NSStringNSNull類型。在構建fullName字符串之前,您必須在for循環中執行任何空值檢查。

刪除此無用行:

[fullList removeObjectIdenticalTo: @"<null>"]; 

並更換for循環與下面的代碼的內容:的

for(int i = 0; i < [firstNames count]; i++) 
{ 
    NSString *firstName = [firstNames objectAtIndex:i]; 
    NSString *lastName = [lastNames objectAtIndex:i]; 
    NSString *org = [organization objectAtIndex:i]; 

    NSMutableArray *namesArray = [NSMutableArray array]; 

    if ([firstName isKindOfClass:[NSString class]]) 
     [namesArray addObject:firstName]; 

    if ([lastName isKindOfClass:[NSString class]]) 
     [namesArray addObject:lastName]; 

    if ([org isKindOfClass:[NSString class]]) 
     [namesArray addObject:org]; 

    if (namesArray.count > 0) 
     [fullNames addObject:[namesArray componentsJoinedByString:@" "]]; 
}