2011-09-19 80 views
0

好了,我已經經歷了一個接近我努力才達到爲例進行了工作,是在例子中,他是直接從他的數據庫調用,唯一的區別,他需要對數據進行切片等。因爲我已經有一個排序的NSArray。錯誤劈裂的NSArray段

這是我工作過的教程 - 我已經創建了被捕獲在NSArray的每個條目,並把這些結果爲基礎的NSDictionary一個α(所以他們將是一個一個的NSDictionary一個方法iPhone Development: Creating Native Contacts like screen

, B,C ...等)

這裏是我的方法。

//method to sort array and split for use with uitableview Index 
- (IBAction)startSortingTheArray:(NSMutableArray *)arrayData 
{ 
    //Sort incoming array alphabetically 
    //sortedArray = [arrayData sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
    [self setSortedArray:[arrayData sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]]; 

    arrayOfCharacters = [[NSMutableArray alloc]init]; 
    objectsForCharacters = [[NSMutableDictionary alloc]init]; 

    for(char c='A';c<='Z';c++) 
    { 

     if([sortedArray count] >0) 
     { 
      [arrayOfCharacters addObject:[NSString stringWithFormat:@"%c",c]]; 
      [objectsForCharacters setObject:sortedArray forKey:[NSString stringWithFormat:@"%c",c]]; 
      NSLog(@"%@", objectsForCharacters); 
     } 
     [sortedArray release]; 


    //Reloads data in table 
    [self.tableView reloadData]; 
    } 
} 

這是把每一個值到每個字母部分,我希望有人能幫助我,使得它如此,如果有數組爲它的值只允許使用字母部分是建立..然後只加載那些值分配到每個部分,而不是每個部分。

回答

4

這段代碼將做到這一點,將是比每個字母濾波陣列一旦有效得多。

//Sort incoming array alphabetically so that each sub-array will also be sorted. 
NSArray *sortedArray = [arrayData sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

// Dictionary will hold our sub-arrays 
NSMutableDictionary *arraysByLetter = [NSMutableDictionary dictionary]; 

// Iterate over all the values in our sorted array 
for (NSString *value in sortedArray) { 

    // Get the first letter and its associated array from the dictionary. 
    // If the dictionary does not exist create one and associate it with the letter. 
    NSString *firstLetter = [value substringWithRange:NSMakeRange(0, 1)]; 
    NSMutableArray *arrayForLetter = [arraysByLetter objectForKey:firstLetter]; 
    if (arrayForLetter == nil) { 
     arrayForLetter = [NSMutableArray array]; 
     [arraysByLetter setObject:arrayForLetter forKey:firstLetter]; 
    } 

    // Add the value to the array for this letter 
    [arrayForLetter addObject:value]; 
} 

// arraysByLetter will contain the result you expect 
NSLog(@"Dictionary: %@", arraysByLetter); 

注意arraysByLetter是一個包含每個存在於你的初始數據「第一個字母」一個陣列的字典。

---增加了關於2011-09-23 ---

[sortedArray removeAllObjects]; 
NSArray *sortedKeys = [arraysByLetter.allKeys sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

for (NSString *key in sortedKeys) { 
    [sortedArray addObject:key]; 
    [sortedArray addObjectsFromArray: [arraysByLetter objectForKey:key]]; 
} 

NSLog(@"Sorted Array: %@", sortedArray); 

輸出如下:

C, 
Computer, 
H, 
Helene, 
Hello, 
J, 
Jules, 
W, 
World 
+0

這工作完美非常感謝,我一直在努力,爲最近2天排序這個問題:P –

+0

這實際上阻止了我能夠打印出resutls到uitabelviewcells ..不知道如何從獲取數據NSDictionary .. –

+0

我猜你的表被綁定到數組。您可能需要將字典的內容放入該數組中。 NSDictionary有一個很好的枚舉器來做到這一點。 – aLevelOfIndirection

0

看起來你需要爲每個字母謂詞來過濾sortedArray。事情是這樣的......

for(char c='A';c<='Z';c++) { 
    NSPredicate *predicate = 
    [NSPredicate predicateWithFormat:@"SELF beginswith[c] '%c'", c]; 
    NSArray *objectsBeginningWithCurrentLetter = [array filteredArrayUsingPredicate:predicate]; 

    if([sortedArray count] >0) 
    { 
     [arrayOfCharacters addObject:[NSString stringWithFormat:@"%c",c]]; 
     if ([objectsBeginningWithCurrentLetter count] > 0) { 
      [objectsForCharacters setObject:objectsBeginningWithCurrentLetter forKey:[NSString stringWithFormat:@"%c",c]]; 
      NSLog(@"%@", objectsForCharacters); 
     } 
    } 
    [sortedArray release]; 


//Reloads data in table 
[self.tableView reloadData]; 
} 
+0

您可能還需要檢查出[蘋果文檔(HTTP: //developer.apple.com/documentation/Cocoa/Conceptual/Predicates/Articles/pUsing.html)使用謂詞對數組進行排序,如果您需要更多的說明。 –

+0

好吧,歡呼吧,現在要讀你的代碼。謝謝您的幫助。 –