1

NSNumberたくさんのsを持つ配列があります。UISliderユーザーがドラッグを停止すると、特定の値が取得されます。配列から成約数を取得したいと思います。

したがって、たとえば、ユーザーがにドラッグし、UISlider13withと;がNSArray含まれている場合。配列から取得したい。NSNumbers101515

配列の例:

NSArray *values = [NSArray arrayWithObjects:[NSNumber numberWithInt:15],
                    [NSNumber numberWithInt:20],
                    [NSNumber numberWithInt:30],
                    [NSNumber numberWithInt:45],
                    [NSNumber numberWithInt:60],
                    [NSNumber numberWithInt:90],
                    [NSNumber numberWithInt:110], nil];

配列から正しい番号を取得するにはどうすればよいですか?

4

2 に答える 2

12

あなたの投稿では、配列がソートされています。常にソートされている場合は、二分探索を使用できます。 NSArrayそのための便利な方法があります:

CGFloat targetNumber = mySlider.value;
NSUInteger index = [values indexOfObject:@(targetNumber)
    inSortedRange:NSMakeRange(0, values.count)
    options:NSBinarySearchingFirstEqual | NSBinarySearchingInsertionIndex
    usingComparator:^(id a, id b) {
        return [a compare:b];
    }];

現在、4 つの可能性があります。

  1. のすべての要素valuesが次より大きいtargetNumber:indexはゼロです。
  2. のすべての要素は:valuesより小さいです。targetNumberindexvalues.count
  3. valuescontains targetNumber: inindexのインデックスです。targetNumbervalues
  4. indexvaluesより大きいの最小要素のインデックスですtargetNumber

ケースを処理する順序で巧妙にリストしました。ケース1は次のとおりです。

if (index == 0) {
    return [values[0] floatValue];
}

ケース 2 は次のとおりです。

if (index == values.count) {
    return [[values lastObject] floatValue];
}

ケース 3 と 4 を一緒に処理できます。

CGFloat leftDifference = targetNumber - [values[index - 1] floatValue];
CGFloat rightDifference = [values[index] floatValue] - targetNumber;
if (leftDifference < rightDifference) {
    --index;
}
return [values[index] floatValue];
于 2012-12-29T23:42:12.663 に答える
2

配列が整っvaluesていて、常に入力した値よりも大きい (または等しい) 値が必要な場合は、次のようにすることができます。

NSInteger count = 0;
do {
    count++;
} while (enteredNum > [values[count] intValue]);

// Do something with [values[count] intValue]
于 2012-12-29T23:23:07.553 に答える