8

ディクショナリをキーでソートしてから値を取得する例をたくさん見てきましたが、代わりに値でソートするにはどうすればよいでしょうか。

例えば

{
blue:12;
red:50;
white:44;
}

これらを次のように降順で並べ替えたいと思います。

{
red:50;
white:44;
blue:12
}

並べ替えられた nsarray を作成できるキーの並べ替えられた nsarray を取得しようとしましたが、結果はまだ順序付けられていないようです。

  NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) {

    if ( first < second ) {
        return (NSComparisonResult)NSOrderedAscending;
    } else if ( first > second ) {
        return (NSComparisonResult)NSOrderedDescending;
    } else {
        return (NSComparisonResult)NSOrderedSame;
    }

  }];
4

3 に答える 3

10

C0deH4cker がすでに述べたように、概念的には NSDictionary はソートされていません。

順序が必要な場合は、キーを配列に書き込むことができます (ただし、キーがディクショナリから削除された後、配列がそれを保持するのに問題があるかもしれませんが、保持しない配列を作成する方法については、 CFArray ) またはNSSortedSet

または、NSDictionary をサブクラス化することもできます — NSDictionary はクラス クラスターであるため、それほど簡単ではありません。しかし幸運なことに、Matt は彼の素晴らしいブログ記事「OrderedDictionary: Cocoa クラス クラスタのサブクラス化」で、ちょっとしたトリックであるhas-a関係の使い方を示しています。


あなたのコードに注意してください

 NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) {

    if ( first < second ) {
        return (NSComparisonResult)NSOrderedAscending;
    } else if ( first > second ) {
        return (NSComparisonResult)NSOrderedDescending;
    } else {
        return (NSComparisonResult)NSOrderedSame;
    }

  }];

C演算子をオブジェクトに適用しているので、やりたいことはしません。これで、それらのポインタが順序付けられます。

それは次のようなものでなければなりません

 NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) {
    return [first compare:second];
  }];

または、オブジェクトとしてのラッパーであるスカラーで注文する場合 (つまり、NSNumber)

 NSArray* sortedKeys = [stats keysSortedByValueUsingComparator:^(id first, id second) { 
    if ([first integerValue] > [second integerValue]) 
        return (NSComparisonResult)NSOrderedDescending;

    if ([first integerValue] < [second integerValue])
        return (NSComparisonResult)NSOrderedAscending;
    return (NSComparisonResult)NSOrderedSame;
}];
于 2012-06-26T23:55:15.277 に答える
0

定義上、辞書は順不同です。高速化のためにハッシュ テーブルを使用してアクセスします。「順序付け」できる唯一の方法は、別のデータ型を選択することです。bast データ型は、意図によって異なります。

于 2012-06-26T23:39:12.087 に答える
0

または、次のように NSString キーを直接ソートすることもできます。

NSArray* sortedKeys = [sortedKeys sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id  _Nonnull obj2) {
        NSNumber *A = @([obj1 LongValue]);
        NSNumber *B = @([obj2 LongValue]);

        return [A compare:B];
    } ];
于 2015-12-18T06:28:30.817 に答える