3

Web サービスを介してアイテムのような数量のパーセンテージをリストしています。取得した応答は、以下のコードに似た辞書の配列です。ソートされた形式で必要です

NSArray *numberArray = [NSArray arrayWithObjects:
    [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:-12.0], @"price", nil],
    [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:-86.0],@"price", nil],
    [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:-8.0],@"price", nil],
    [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:12.0],@"price", nil],
    [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:2.0],@"price", nil],
    [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:112.0],@"price", nil], nil];

JSON 応答のログは次のとおりです。

[
    {
        price = "-12";
    },
        {
        price = "-86";
    },
        {
        price = "-8";
    },
        {
        price = 12;
    },
        {
        price = 2;
    },
        {
        price = 112;
    }
]
4

4 に答える 4

4
NSArray *sortedResult = [numberArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSNumber *num1 = [obj1 objectForKey:@"price"];
    NSNumber *num2 = [obj2 objectForKey:@"price"];
    return [num1 compare:num2];
}];
NSLog(@"---%@",sortedResult);

sortedResult を降順にしたい場合は、
return ステートメントで num1 と num2 を入れ替えます。

于 2013-08-29T12:05:42.857 に答える
2

価格がNSNumberオブジェクトとして保存されている場合、@trojanfoe のリンク ( NSDictionary オブジェクトの NSArray を並べ替えるための最良の方法? ) のメソッドが機能するはずです。

NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"price" ascending:YES];
NSArray *sorted = [numberArray sortedArrayUsingDescriptors:@[sd]];

しかし、あなたの最後のコメントから、価格は文字列として保存されているようです。その場合、floatValue各文字列を浮動小数点値に変換するため、次のように動作します。

NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"price.floatValue" ascending:YES];
NSArray *sorted = [numberArray sortedArrayUsingDescriptors:@[sd]];
于 2013-08-29T12:04:45.480 に答える
0
sortedArray = [numberArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    float first  = [(NSNumber *)a[@"price"] floatValue];
    float second = [(NSNumber *)b[@"price"] floatValue];

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

    return NSOrderedSame;
}];
于 2013-08-29T12:00:12.137 に答える