我试图将NSArray中的一个对象与两个不同NSArray中的两个对象进行比较,我希望存储该对象的第一个出现并丢弃下一个对象。
e.g: -
我有一个Array1,它包含像(20.12,20.15,21.4,22.6,23.0,24.2,28.7,30.5,30.9,32.6,33.7)这样的对象。 现在我有另一个Array2包含像(20.00,22.0,28.0,30.0,33.0)这样的对象和另一个包含像(21.0,24.0,29.0,32.0,34.0)等对象的Array3
现在我要存储介于两者之间的第一个对象(20.00 - 21.0,22.0 - 24.0,28.0 - 29.0,30.0 - 32.0,33.0 - 34.0)。我试图通过使用
来实现这一点if (clickTimeInterval >= [[Array2 objectAtIndex:i] doubleValue] && clickTimeInterval <= [[Array3 objectAtIndex:i] doubleValue]) {
我的clickTimeInterval是存储在Array1中的时间间隔。我能够获取值,但我只想存储最先出现的值并存储到Array4中。看起来像Array4 =(20.12,22.6,24.2,28.7,30.5,33.7)。有人可以帮我解决一下这个问题吗?
答案 0 :(得分:2)
这取决于您希望的优化程度。这是一个重新采样&#34; Array1&#34;对于每个范围。如果您要过滤大量对象(并对它们进行排序),您可以存储最后找到的位置,以便更快地进行后续搜索。
- (NSArray *)bucketTest {
NSMutableArray *result = [NSMutableArray array];
NSArray *samples = [NSArray arrayWithObjects:[NSNumber numberWithDouble:1.1], [NSNumber numberWithDouble:1.5], [NSNumber numberWithDouble:2.2], nil];
NSArray *lows = [NSArray arrayWithObjects:[NSNumber numberWithDouble:1.0], [NSNumber numberWithDouble:2.0], nil];
NSArray *highs = [NSArray arrayWithObjects:[NSNumber numberWithDouble:2.0], [NSNumber numberWithDouble:3.0], nil];
for (int bucket = 0; bucket < [lows count]; bucket++) {
double low = [[lows objectAtIndex:bucket] doubleValue];
double high = [[highs objectAtIndex:bucket] doubleValue];
for (NSNumber *sample in samples) {
if (([sample doubleValue] >= low) && ([sample doubleValue] < high)) {
[result addObject:sample];
break;
}
}
}
return result;
}
答案 1 :(得分:2)
提高第一个答案的效率。 这里我假设所有数组都已排序
再创建一个我们将在每次迭代中更改的数组
NSArray *array5 = [array1 copy];
NSMutableArray *array4 = [NSMutableArray array];
for (int i=0; i < array2.count; i++) {
NSNumber *bottom = [array2 objectAtIndex:i];
NSNumber *top = [array3 objectAtIndex:i];
NSPredicate *greaterThanPredicate = [NSPredicate predicateWithFormat:
@"SELF > %@", bottom];
NSMutableArray *arrayWithBiggerObjects = [NSMutableArray arrayWithArray:[array5 filteredArrayUsingPredicate:greaterThanPredicate]];
if (arrayWithBiggerObjects.count) {
NSNumber *lowestObject = [arrayWithBiggerObjects objectAtIndex:0];
if ([lowestObject compare:top] == NSOrderedDescending) {
[array4 addObject:lowestObject];
[arrayWithBiggerObjects removeObject:lowestObject];
array5 = arrayWithBiggerObjects;
}
}
}
答案 2 :(得分:1)
假设
您可以执行以下操作
NSMutableArray *array4 = [NSMutableArray array];
for (int i=0; i < array2.count; i++) {
NSNumber *bottom = [array2 objectAtIndex:i];
NSNumber *top = [array3 objectAtIndex:i];
NSPredicate *betweenPredicate = [NSPredicate predicateWithFormat:
@"SELF > %@ && SELF < %@", bottom, top];
NSArray *inRange = [array1 filteredArrayUsingPredicate:betweenPredicate];
if (inRange.count) {
[array4 addObject:[inRange objectAtIndex:0]];
}
else {
[array4 addObject:[NSNull null]]; // or don't add anything
}
}