0

Obj-C の KVC で再びスタックしました。

KVC を使用して、複数のキーの最小値を見つけたいと考えています。

次の配列を検討してください。

NSArray *data = [[NSArray alloc] initWithObjects:
                 [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:2.0], @"a", [NSNumber numberWithFloat:5.0], @"b", [NSNumber numberWithFloat:4.0], @"c", nil],
                 [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:3.0], @"a", [NSNumber numberWithFloat:1.0], @"b", [NSNumber numberWithFloat:1.5], @"c", nil],
                 [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:9.0], @"a", [NSNumber numberWithFloat:7.0], @"b", [NSNumber numberWithFloat:6.0], @"c", nil],
                 nil];

「a」、「b」、または「c」の最小値は、次の方法で簡単に見つけることができます。

float minKeyA = [[data valueForKeyPath:@"@min.a"] floatValue];  // value: 2.0
float minKeyB = [[data valueForKeyPath:@"@min.b"] floatValue];  // value: 1.0
float minKeyC = [[data valueForKeyPath:@"@min.c"] floatValue];  // value: 1.5

私が達成したいのは、キーの NSSet または NSArray を取得し、それらのキーのプール全体で最小値を見つけることです。

NSSet *keySet1 = [NSSet setWithObjects:@"a", @"b", nil]; 
// use to find absolute minimum value across keys 'a' and 'b' --> desired value 1.0
NSSet *keySet2 = [NSSet setWithObjects:@"a", @"c", nil];
// use to find absolute minimum value across keys 'a' and 'c' --> desired value 1.5
NSSet *keySet3 = [NSSet setWithObjects:@"a", @"b", @"c", nil];
// use to find absolute minimum value across keys 'a', 'b', and 'c' --> desired value 1.0

ポインタに感謝します:)

4

1 に答える 1

1

単純な解決策は、最初に各キーの最小値を見つけ、次に 2 番目のステップでそれらの最小値の中から最小値を見つけることです。

NSMutableSet *localMinima = [NSMutableSet setWithCapacity:[keySet1 count]];
for (NSString *key in keySet1) {
    NSString *keyPath = [NSString stringWithFormat:@"@min.%@", key];
    NSNumber *localMin = [data valueForKeyPath:keyPath];
    [localMinima addObject:localMin];
}
NSNumber *globalMin = [localMinima valueForKeyPath:@"@min.self"];
于 2012-06-20T14:30:14.947 に答える