2012-03-12 89 views
28

我已經創建了一個排序描述符來排序來自我的服務器的plist響應。這適用於具有高達9的值的排序鍵。對於超過10個項目,我看到突變結果,排序鍵按順序排列= 1,10,11,2,3,4,5,6,7,8,90。對NSString值進行排序,就好像NSInteger使用NSSortDescriptor一樣

NSSortDescriptor *aSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sort" ascending:YES]; 
self.myList = [NSMutableArray arrayWithArray:[unsortedList sortedArrayUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]]]; 

如何使它按照1,2,3,4,5,6,7,8,9,10,11的正確順序排列?

回答

44

您可以通過創建時實現自定義比較塊你NSSortDescriptor做到這一點:

NSSortDescriptor *aSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"sort" ascending:YES comparator:^(id obj1, id obj2) { 

    if ([obj1 integerValue] > [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 
    if ([obj1 integerValue] < [obj2 integerValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 
    return (NSComparisonResult)NSOrderedSame; 
}]; 
self.myList = [NSMutableArray arrayWithArray:[unsortedList sortedArrayUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]]]; 

看到蘋果文檔here

+1

請注意,此解決方案將無法與CoreData fetchRequests工作,因爲它不接受基於塊的描述符。 – OlDor 2016-01-11 03:46:39

7
NSMutableArray *list = [NSMutableArray arrayWithObjects:@"11",@"2",@"3",@"1", nil]; 
[list sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    NSInteger firstInteger = [obj1 integerValue]; 
    NSInteger secondInteger = [obj2 integerValue]; 
    if(firstInteger > secondInteger) return NSOrderedDescending; 
    if(firstInteger == secondInteger) return NSOrderedSame; 
    return NSOrderedAscending; // edited 
}]; 

並未作出任何保證性能

+0

請注意,此解決方案不適用於CoreData fetchRequests,因爲它不接受基於塊的描述符。 – OlDor 2016-01-11 03:47:23

11

你需要你的字符串與NSNumericSearch選項進行比較:

串內張

NSNumericSearch
的數用比較了數字值,即,Name2.txt < Name7.txt < Name25.txt

這需要調用compare:options:方法進行比較。

爲了做到這一點,你的排序描述符可以使用NSComparator Block

[NSSortDescriptor sortDescriptorWithKey:@"self" 
           ascending:YES 
          comparator:^(NSString * string1, NSString * string2){ 
              return [string1 compare:string2 
                  options:NSNumericSearch]; 
}]; 

,或者更確切地說,你可以跳過排序描述符和簡單sort the array directly,使用相同的塊:

[unsortedList sortedArrayUsingComparator:^NSComparisonResult (NSString * string1, NSString * string2){ 
    return [string1 compare:string2 
        options:NSNumericSearch]; 
}]; 
+0

小增加:爲什麼要轉換成'NSString'?您可以直接傳遞'NSString'而不是'id',這樣可以更容易閱讀。 :-) – 2013-03-08 13:58:16

+0

這是一個很棒的點,@Blauesocke;謝謝! – 2013-03-08 17:52:39

+0

請注意,此解決方案不適用於CoreData fetchRequests,因爲它不接受基於塊的描述符。 – OlDor 2016-01-11 03:47:14

38

[list sortUsingSelector:@selector(localizedStandardCompare:)];會以「人」的方式對列表進行排序(所以「11」最後會出現,而不是「1」和「2」之間)。但是如果你真的想把這些字符串當作數字來對待,你應該先讓它們成爲數字!

+1

這種方式更清潔。 – pir800 2012-12-05 21:28:56

+0

完美!其他解決方案對我來說不起作用,因爲CoreData不接受基於塊的sortDescriptors。但是這個工作。 – OlDor 2016-01-11 03:45:33

+0

對我來說最好的解決方案;) – 2017-02-12 09:27:58

16
NSSortDescriptor *aSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sort.intValue" ascending:YES]; 
self.myList = [NSMutableArray arrayWithArray:[unsortedList sortedArrayUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]]]; 

根據整數的值進行排序。

+0

完美的簡單! – DonnaLea 2014-07-17 06:17:26

+0

沒有工作。我得到'0 1 10 11 12 ... 2 3 4'而不是'0 1 2 3 4 ... 10 11 12' – OlDor 2016-01-11 03:21:21

+0

最簡單的答案。很好地處理整數值 – 2016-02-24 09:57:29

0

以上所有方法都需要很好的基礎知識來實施;但對於新手我建議最簡單的方法 - 使用[NSSortDescriptor sortDescriptorWithKey使用本地塊的方法

NSArray* sortedArr =[fetchResults sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 

    int aValue = [[a valueForKey:@"subgroupId"] intValue]; 
    int bValue = [[b valueForKey:@"subgroupId"] intValue]; 

    return aValue > bValue; 
}]; 
0

輸入

{ 
    "seats": [{ 
     "seatNumber": "1" 
    }, { 
     "seatNumber": "10" 
    }, { 
     "seatNumber": "2" 
    }] 
} 

排序:@ 「seatNumber」 升:是選擇:@selector(localizedStandardCompare :)]。關鍵是使用localizedStandardCompare。這會解決你的問題。

NSArray *seats = [self.seats sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"seatNumber" ascending:YES selector:@selector(localizedStandardCompare:)]]]; 

輸出

{ 
    "seats": [{ 
     "seatNumber": "1" 
    }, { 
     "seatNumber": "2" 
    }, { 
     "seatNumber": "10" 
    }] 
} 

文檔: https://developer.apple.com/documentation/foundation/nsstring/1409742-localizedstandardcompare

+0

你不應該只用代碼回答,而是嘗試給出一個描述/解釋它的作用,它是如何解決問題的,等等。 – 2017-10-13 23:56:40

相關問題