4

並べ替え値が等しい配列要素をグループ化しながら、NSArray を並べ替えようとしている Objective-C アプリケーションがあります。理想的には、セットの新しい配列を生成します。新しい配列の各セットには元の配列要素が 1 つ以上含まれ、各セットのすべての要素は同じ並べ替え値を持ちます。Rubyの「チャンク」メソッドと同様に機能します

例を挙げると、並べ替え値が次のような項目を含む NSArray があるとします。

[1, 3, 5, 7, 9, 8, 5, 3, 2, 4, 3, 6]

新しい配列には、次のような並べ替え値を持つ 9 つのセットが含まれている必要があります。

[ (1), (2), (3, 3, 3), (4), (5, 5), (6), (7), (8), (9) ]

Ruby では、最初に配列をソートしてからチャンクして、必要なものを取得できます。私は、Objective-C でそれを行うための合理的に効率的な方法を考え出そうとしています。

各キーの値として NSSet を持つキーとして、可能な各ソート値を含む辞書を設定できます。次に、最初の配列をループ処理して、各項目の並べ替え値を計算し、その並べ替え値に適したキーを見つけて、そのセットを随時更新します。最終的に、その辞書の内容を並べ替えて、並べ替えられたセットのリストを取得できました。

私はそれをすべて行うことができましたが、私が見逃しているより良い方法があるはずです。また、私がソートしている値は実際には浮動小数点値である可能性があるため、それらを辞書のキーとして使用する価値は限られている可能性があります。

これを行うためのより賢い方法を考えられる人はいますか? ここで明らかな何かが欠けていますか?

4

2 に答える 2

1

NSCountedSetすべてのキーとそれぞれの数を格納するためにシングルを使用しないのはなぜですか?

NSArray *sourceArray = @[ @1, @3, @5, @7, @9, @8, @5, @3, @2, @4, @3, @6 ];
NSCountedSet *countedSet = [[NSCountedSet alloc] initWithArray:sourceArray];

NSArray* sortedKeys = [[countedSet allObjects] sortedArrayUsingSelector:@selector(compare:)];
for (NSNumber *key in sortedKeys) {
    NSUInteger count = [countedSet countForObject:key];
    NSLog(@"Key: %@ count: %ld", key, (unsigned long)count);
}
于 2013-09-08T01:09:59.013 に答える