0

そのため、カスタムの「要素」オブジェクトの配列があり (原子番号、化学記号、原子質量などを保持しています...)、プロパティの 1 つでそれらを並べ替えるのに問題があります。

コードは次のとおりです。

switch (sortDescriptor) {

        case 0: {
            //Sort the array by "ATOMIC NUMBER"
            NSArray *sortedArray = [self.elementsArray sortedArrayUsingComparator:^(id a, id b) {
                NSNumber *first = @([(SAMElement *)a atomicNumber]);
                NSNumber *second = @([(SAMElement *)b atomicNumber]);
                return [first compare:second];
            }];
            self.elementsArray = [sortedArray mutableCopy];
        }

        case 1: {
            //Sort the array by "ELEMENT NAME"
            NSArray *sortedArray = [self.elementsArray sortedArrayUsingComparator:^(id a, id b) {
                NSString *first = [(SAMElement *)a elementName];
                NSString *second = [(SAMElement *)b elementName];
                return [first compare:second];
            }];
            self.elementsArray = [sortedArray mutableCopy];
        }
        case 2:{
            NSLog(@"sorting by chemical symbol");
            //Sort the array by "CHEMICAL SYMBOL"
            NSArray *sortedArray = [self.elementsArray sortedArrayUsingComparator:^(id a, id b) {
                NSString *first = [(SAMElement *)a  chemichalSymbol];
                NSString *second = [(SAMElement *)b chemichalSymbol];
                return [first compare:second];
            }];
            self.elementsArray = [sortedArray mutableCopy];
        }

        case 3: {
            //Sort the array by "ATOMIC MASS"
            NSArray *sortedArray = [self.elementsArray sortedArrayUsingComparator:^(id a, id b) {
                NSNumber *first = [(SAMElement *)a atomicMass];
                NSNumber *second = [(SAMElement *)b atomicMass];
                return [first compare:second];
            }];
            self.elementsArray = [sortedArray mutableCopy];
        }
        default:
            break;
    }

ソートすると、要素の完全にランダムなリストが返されます。私は何か間違ったことをしていますか?

4

2 に答える 2

3

オブジェクトのいくつかのプロパティでオブジェクトの配列をソートする最良の方法は、NSSortDescriptor を使用することです。ではinitWithKey、並べ替えるプロパティの名前を設定できます。

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"atomicNumber" ascending:NO];   
[self.elementsArray sortUsingDescriptors:@[sortDescriptor]];

あなたの場合、上記のコードを switch ステートメントの各 case セクションにコピーして、 と のキーを変更し@"elementName"ます@"chemichalSymbol"

必要な注文のタイプに応じて、ascending値を からNOに変更できます。YES

うまくいったかどうか教えてください。

于 2013-08-02T13:11:13.080 に答える
1

私はすぐにバグを見ていませんが、ここで車輪を再発明しています. このための正しいツールはsortedArrayUsingDescriptors:

[self.elementsArray sortedArrayUsingDescriptors:@[ 
                 [NSSortDescriptor alloc] initWithKey:@"atomicNumber"] ascending:YES]
                                                  ]];

それを試して、バグが解消されるかどうかを確認してください。ランダムな順序を取得している場合は、通常、コンパレーターに一貫性がないことを示唆しています (同じ A&B に対して A>B の場合もあれば、B>A の場合もあります)。

于 2013-08-02T13:11:35.313 に答える