4

ビジネス オブジェクトの配列を並べ替える次の並べ替え記述子があり、テーブルに表示する準備ができています。以前の SO の質問からのサンプル並べ替えコードから始めています。

NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"awardedOn" ascending:NO];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, nil];
NSArray *sortedArray = [returnable sortedArrayUsingDescriptors:sortDescriptors];

私が表示しているすべてのオブジェクトにはタイトルがあります。NSDate である「awardedOn」セットを持つのは一部だけです。

私がしたいこと:

  1. 「awardedOn」が設定されたすべてのオブジェクトが一番上に表示されるように、配列全体を並べ替えます
  2. 2 つの「セット」内で、アルファベット順に並べます
  3. 日付の実際の値は気にしません。存在するかどうかに興味があります

このようなもの(タイトル、太字のものは授与された値を持っています)

  • 素晴らしい
  • より良い
  • 涼しい
  • もうひとつ
  • もう1つ
  • まだ別
4

3 に答える 3

1

次の 2 つの方法があります。

  1. ビジネス オブジェクトを作成するときは、awardedOn日付distantPastが存在しないかのように割り当ててから、通常の並べ替えを実行しawardedOn、次に で並べ替えtitleます。

  2. 各ビジネス オブジェクトで呼び出されるカスタム比較メソッドを使用して、並べ替え記述子を作成します。

.

NSSortDescriptor *awardDescriptor = [NSSortDescriptor descriptorWithKey:@"awardedOn"
                                                              ascending:NO 
                                                               selector:@selector(compareAwardedOn:)];

// In class for business object
- (NSComparisonResult)compareAwardedOn:(id)otherBusiness {
    // return custom NSComparison result after 
    // checking whether either of awardedOn dates are nil.
    return NSOrderedSame;
}
于 2012-06-19T10:23:27.340 に答える
1

最初に言ったように、最初に awardOn で、次にタイトルで、2 つの記述子を使用してそれを行うことができるはずです。ただし、次のような awardOn ソート用のカスタム NSSortDescriptor を提供する必要があります。

#define NULL_OBJECT(a) ((a) == nil || [(a) isEqual:[NSNull null]]) 
@interface AwardedOnSortDescriptor : NSSortDescriptor {} 
@end 
@implementation AwardedOnSortDescriptor 
- (id)copyWithZone:(NSZone*)zone 
{ 
    return [[[self class] alloc] initWithKey:[self key] ascending:[self ascending] selector:[self selector]]; 
} 
- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2 
{ 
    if (NULL_OBJECT([object1 valueForKeyPath:[self key]])) { 
        if (NULL_OBJECT([object2 valueForKeyPath:[self key]]))  
            return NSOrderedSame; // If both objects have no awardedOn field, they are in the same "set"
        return NSOrderedDescending; // If the first one has no awardedOn, it is sorted after         
    } 
    if (NULL_OBJECT([object2 valueForKeyPath:[self key]])) { 
        return NSOrderedAscending; // If the second one has no awardedOn, it is sorted after
    } 
    return NSOrderedSame; // If they both have an awardedOn field, they are in the same "set"
} 
@end 

これにより、あなたの例では、Awesome / Better / CoolとAnother / Another One / One More / Yet anotherのセットを分離する必要があります。その後、次のことが得意になるはずです。

NSSortDescriptor *sortDescriptor1 = [[AwardedOnSortDescriptor alloc] initWithKey:@"awardedOn" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];

最後に、「空」の awardOn フィールドがどのように見えるかによっては、もう少し作業が必要になる場合があります (上記のコードでは、フィールドが null に設定されていると仮定しました)。ここで見ることができます:https://stackoverflow.com/a/3145789

于 2012-06-25T12:03:10.460 に答える
0

コンパレータを使用してみてください:

_finalArray =  [_array sortedArrayUsingComparator: ^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) 
               {
                   if([[obj1 valueForKey@"awardedOn"] lenght] && ![[obj2 valueForKey@"awardedOn"] lenght])
                       return NSOrderedDescending;
                    if([[obj2 valueForKey@"awardedOn"] lenght] && ![[obj1 valueForKey@"awardedOn"] lenght])
                       return NSOrderedAscending;
                   return NSOrderedSame;
               }];
于 2012-06-19T10:32:36.423 に答える