1

重複をソートして削除したい NSDictionaries の NSArray があります。私が抱えている問題は、NSDictionary に startYear と finishYear の 2 つの要素が含まれいるため、startYearfinishYearを使用して並べ替えたい Dictionary 値の NSArray があることです。

NSDictionary は次のようになります。どちらにも文字列値が含まれています。

starYear
finishYear

両方に含まれる値は次のようになります -

(startYear / finishYear)
------------------------
(0 - 1999)
(1999 - 0)
(1999 - 2000)
(2001 - 2008)
(2000 - 2010)
(0 - 1999)
(0 - 2006)

このように見えるはずです -

(startYear / finishYear)
------------------------
(0 - 1999)
(1999 - 0)
(1999 - 2000)
(0 - 2006)
(2000 - 2010)
(2001 - 2008)

ご覧のとおり、繰り返し値は削除されています。startYear が 0 の場合、その値は finishYear でソートされます。startYear と finishYear が利用可能な場合、その startYear にソートされ、終了年に従って並べ替えられます。

これにアプローチする方法さえ完全に途方に暮れています。セットなどについて読んだことがあります。しかし、NSDictionaryの2つの要素に従ってソートする方法がわかりません。

これが助けを得るのに十分な情報であることを願っています。これを解決するためのコード例の提案は大歓迎です。

4

1 に答える 1

2

これには、NSOrderedSet または NSArray を使用できます。コンパレータを使用してソートする配列を想定しましょう。このようなもの:

NSString const * kStartYear = @"startYear";
NSString const * kFinishYear = @"finishYear";

NSArray *unsortedArray = @[
                           @{kStartYear:@0,
                             kFinishYear:@1999},
                           @{@"startYear":@1999,
                             kFinishYear:@0},
                           @{kStartYear:@1999,
                             kFinishYear:@2000},
                           @{kStartYear:@2001,
                             kFinishYear:@2008},
                           @{kStartYear:@2000,
                             kFinishYear:@2010},
                           @{kStartYear:@0,
                             kFinishYear:@2006},
                           ];

NSArray *sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    NSDictionary *dictA = a;
    NSDictionary *dictB = b;

    NSNumber *startYear1 = dictA[kStartYear];
    NSNumber *startYear2 = dictB[kStartYear];
    return [startYear1 compare:startYear2];

    // Put in more logic for your comparison
}];


NSLog(@"sorted: %@", sortedArray);

更新: より正しいコード

于 2013-04-25T21:51:27.510 に答える