2011-08-16 54 views
3

我的tableView應用程序將數據加載到表視圖中。 一切都很完美,但是數組排序有點混亂,就像你在下面的圖片中看到的一樣。我想過使用sortedArrayUsingSelector來解決問題,但我不確定我應該使用哪種「排序方法」。 You can see, the numbers don't go like 1. 2. 3. 4. 5. etc, but weird...在tableView中瘋狂的數組排序! sortedArrayUsingSelector有幫助嗎?

我該如何對它進行排序,以便根據數字對單元格進行排序?喜歡的順序是1. 2. 3. 4. 5.不等於1. 10. 11. 12. 13. 14. 2. 3.?

非常感謝!

+0

你是如何在這個數據加載/什麼類型的結構是持久數據存儲(即plist出現nsdictionary/nsarray或核心數據) – Kaiser

+0

數組排序看起來正確。 '10'在'1.'之後和'2'之前排序。請記住,計算機不會像您一樣識別號碼。 –

+0

好的,但我怎麼能按照我想要的方式做到這一點? @邁克爾其plist :) –

回答

5

和兩班輪:

NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES comparator:^(id obj1, id obj2) { return [obj1 compare:obj2 options:NSNumericSearch]; }]; 
rowTitleArray = [rowTitleArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]]; 
+0

嗯好吧..但我怎麼能實現它在「arraySortedWithSelector」方法? –

+0

順便說一句,我真的很感激你的幫助......它讓我着迷於人們如何願意幫助完全陌生人幾乎沒有獎勵... –

+0

Chuck'arraySortedUsingSelectors'。使用其對應的'arraySortedUsingDescriptors'。 – Akshay

1

對不起,這個令人費解的做法,但這樣做的工作......

NSArray *rowTitleArray = [[NSArray alloc] initWithObjects: 
          @"10. Tenth", 
          @"15. Fifteenth", 
          @"13. Thirteenth", 
          @"1. First", 
          @"2. Second", 
          @"22. TwentySecond", nil]; 

NSMutableArray *dictionaryArray = [NSMutableArray array]; 
for (NSString *original in rowTitleArray) { 
    NSString *numberString = [[original componentsSeparatedByString:@"."] objectAtIndex:0]; 
    NSNumber *number = [NSNumber numberWithInt:[numberString intValue]]; 
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
          number, @"number", original, @"rowTitle", nil]; 
    [dictionaryArray addObject:dict]; 
} 
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"number" ascending:YES]; 
NSArray *sortedDictionaryArray = [dictionaryArray sortedArrayUsingDescriptors: 
            [NSArray arrayWithObject:descriptor]]; 
NSMutableArray *sortedRowTitles = [NSMutableArray array]; 
for (NSDictionary *dict in sortedDictionaryArray) { 
    [sortedRowTitles addObject:[dict objectForKey:@"rowTitle"]]; 
} 
rowTitleArray = [NSArray arrayWithArray:sortedRowTitles]; 

NSLog(@"%@", rowTitleArray); 

輸出:

 
    "1. First", 
    "2. Second", 
    "10. Tenth", 
    "13. Thirteenth", 
    "15. Fifteenth", 
    "22. TwentySecond" 

我會盡量想一個更優雅的解決方案。

+0

嗯,非常感謝...如果你找到一個更優雅的解決方案,請讓我知道...我發現這個http://stackoverflow.com/questions/4588542/sorting-nsarray-which-很多包含數字,但不能明智地從它:(也許它可以幫助你... –

+0

看到我上面的新的雙線,我認爲這是最短也最快的方法(也許也是最優雅的一個) – Mundi

1

這裏是一個更優雅的解決方案:

NSInteger intSort(id num1, id num2, void *context) { 
    NSString *n1 = (NSString *) num1; 
    NSString *n2 = (NSString *) num2; 
    n1 = [[n1 componentsSeparatedByString:@"."] objectAtIndex:0]; 
    n2 = [[n2 componentsSeparatedByString:@"."] objectAtIndex:0]; 
    if ([n1 intValue] < [n2 intValue]) { 
     return NSOrderedAscending; 
    } 
    else if ([n1 intValue] > [n2 intValue]) { 
     return NSOrderedDescending; 
    } 
    return NSOrderedSame; 
} 

rowTitleArray = [rowTitleArray sortedArrayUsingFunction:intSort context:NULL];