6

の配列を並べ替えようとしていますNSObjects(オブジェクトはクラスです)。オブジェクトクラスには、配列内のオブジェクトを並べ替えるために使用したいいくつかの変数があります。並べ替えに使用している変数は、タイプNSStringまたはNSIntegerです。私はsを並べ替えていると確信 していますNSStringが、この質問については、の並べ替えNSInteger

これは私がオブジェクトの配列をソートするために使用している方法です、それはオブジェクトのを受け取りNSMutableArrayます

- (NSMutableArray *)startSortingTheArray:(NSMutableArray *)unsortedArray
{
    [unsortedArray sortUsingComparator:^ NSComparisonResult(SearchResultItem *d1, SearchResultItem *d2) {
        NSInteger DoorID1 = d1.doorID;
        NSInteger DoorID2 = d2.doorID;
        NSComparisonResult result = [DoorID1 localizedCompare:DoorID2]; // Not sure how to sort these two integers
        if (result == NSOrderedSame) {
            NSString *handel1 = d1.handel;
            NSString *handel2 = d2.handel;
            result = [handel1 localizedCompare:handel2];
         }

NSIntegerを比較する方法がわかりません。それ自体から各数値を引くことができることを読みました。数値が0の場合、それらは等しいか、+ 1 / -1などです。しかし、それがそうであるかどうかはわかりません。これにアプローチするための最良の方法。

どんな助けでもいただければ幸いです。

4

4 に答える 4

19
[unsortedArray sortUsingComparator:^ NSComparisonResult(SearchResultItem *d1, SearchResultItem *d2) {
    NSInteger doorID1 = d1.doorID;
    NSInteger doorID2 = d2.doorID;
    if (doorID1 < doorID2)
        return NSOrderedAscending;
    if (doorID1 > doorID2)
        return NSOrderedDescending;
    return [d1.handel localizedCompare: d2.handel];
}];

NSOrdered(Ascending | Descending | same)を返すよう[aString localizedCompare:anotherString]に、文字列の場合の結果を返すことができます。

于 2012-08-14T00:08:29.757 に答える
2

AnNSIntegerはオブジェクトではありません。これは単なる整数(anintまたはa long)です。したがって、2つのを比較する方法とまったく同じようにそれらを比較できますint

従来のC比較関数を使用すると、このトリックを実行できますが、列挙x - y型に収まらない整数を返すため、ここでは適切ではありません。NSComparisonResultそのため、おそらく次のようなことを行う必要があります

if (DoorID1 == DoorID2) {
    // compare secondary attribute
    NSString *handel1 = d1.handel;
    NSString *handel2 = d2.handel;
    return [handel1 localizedCompare:handel2];
}
else if (DoorID1 < DoorID2) return NSOrderedAscending;
else return NSOrderedDescending;

ちなみに、ソート基準はNSSortDescriptor代わりにで表すことができますが、これはより明確な場合があります。

- (NSMutableArray *)startSortingTheArray:(NSMutableArray *)unsortedArray {
    NSSortDescriptor *primary = [NSSortDescriptor sortDescriptorWithKey:@"doorID" ascending:YES];
    NSSortDescriptor *secondary = [NSSortDescriptor sortDescriptorWithKey:@"handel" ascending:YES selector:@selector(localizedCompare:)];
    [unsortedArray sortUsingDescriptors:@[primary, secondary]];
}
于 2012-08-14T00:07:56.727 に答える
2

別のオプション:

NSComparisionResult res = [@(d1.doorID) compare:@(d2.doorID)];
return res == NSOrderedSame ? [d1.handel localizedCompare: d2.handel] : res;
于 2014-10-13T14:06:26.580 に答える
1
[unsortedArray sortUsingComparator:^ NSComparisonResult(SearchResultItem *d1, SearchResultItem *d2) {
    NSInteger doorID1 = d1.doorID;
    NSInteger doorID2 = d2.doorID;
    if (doorID1 > doorID2)
        return NSOrderedAscending;
    if (doorID1 < doorID2)
        return NSOrderedDescending;
    if (doorID1==doorID2) {
        NSString *s1=d1.someString;
        NSString *s2=d2.someString;
        return [s1 compare:s2];
    }
}
于 2012-08-14T00:35:43.317 に答える