gpt4 book ai didi

objective-c - 在 NSArray 中搜索最近的数字

转载 作者:太空狗 更新时间:2023-10-30 03:42:27 25 4
gpt4 key购买 nike

是否有一种简单的方法来搜索数字的 NSArray 以找到与用户输入数字最接近(或精确匹配,如果存在)的方法?

假设我有一个这样的数组:7, 23, 4, 11, 18, 2,用户输入 5

程序按接近程度降序返回三个最接近的值:4, 7, 2最重要的给出NSArray索引三个对象中的一个:2、0、5

最佳答案

更新:请参阅下文以获得比我的第一个更好的解决方案。

这是一个针对每个数字及其索引使用 NSDictionary 包装器的解决方案,并使用比较器 block 进行排序。它可能无法很好地扩展,但可以完成工作。

static NSString *const kValueKey = @"value";
static NSString *const kIndexKey = @"index";

+ (void)searchArray:(NSArray *)array forClosestValuesTo:(int)value resultValues:(NSArray **)values resultIndexes:(NSArray **)indexes
{
NSMutableArray *searchObjs = [NSMutableArray arrayWithCapacity:[array count]];

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[searchObjs addObject:[NSDictionary dictionaryWithObjectsAndKeys:obj, kValueKey, [NSNumber numberWithUnsignedInt:idx], kIndexKey, nil]];
}];

[searchObjs sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSUInteger d1 = ABS([[obj1 objectForKey:kValueKey] intValue] - value);
NSUInteger d2 = ABS([[obj2 objectForKey:kValueKey] intValue] - value);
if (d1 == d2) { return NSOrderedSame; }
if (d1 < d2) { return NSOrderedAscending; }
return NSOrderedDescending;
}];

NSArray *results = [searchObjs subarrayWithRange:NSMakeRange(0, 3)];

if (values) {
*values = [results valueForKey:kValueKey];
}

if (indexes) {
*indexes = [results valueForKey:kIndexKey];
}
}

更新:这里有一个更新的解决方案,可以对 C 索引数组进行排序,不再需要 NSDictionary 包装器

static NSString *const kValueKey = @"value";
static NSString *const kArrayKey = @"array";

int
CSCompareIndexes(void *data, const void *value1, const void *value2)
{
NSDictionary *dict = (NSDictionary *)data;

NSArray *array = [dict objectForKey:kArrayKey];
int valueToFind = [[dict objectForKey:kValueKey] intValue];

int index1 = *(int *)value1;
int index2 = *(int *)value2;

NSNumber *num1 = [array objectAtIndex:index1];
NSNumber *num2 = [array objectAtIndex:index2];

return ABS([num1 intValue] - valueToFind) - ABS([num2 intValue] - valueToFind);
}

void
CSSearchNumberArray(NSArray *array, int valueToFind, NSArray **resultValues, NSArray **resultIndexes)
{
NSInteger numValues = [array count];

NSUInteger *indexes = malloc(sizeof(NSUInteger) * numValues);
assert(indexes);

int i;
for (i = 0; i < numValues; i++) {
indexes[i] = i;
}

NSDictionary *data = [NSDictionary dictionaryWithObjectsAndKeys:array, kArrayKey, [NSNumber numberWithInt:valueToFind], kValueKey, nil];
qsort_r(indexes, numValues, sizeof(NSUInteger), (void *)data, CSCompareIndexes);

NSMutableArray *tmpValues = [NSMutableArray arrayWithCapacity:3],
*tmpIndexes = [NSMutableArray arrayWithCapacity:3];

for (i = 0; i < 3; i++) {
[tmpValues addObject:[array objectAtIndex:indexes[i]]];
[tmpIndexes addObject:[NSNumber numberWithInt:indexes[i]]];
}

if (resultValues) {
*resultValues = [NSArray arrayWithArray:tmpValues];
}

if (resultIndexes) {
*resultIndexes = [NSArray arrayWithArray:tmpIndexes];
}

free(indexes);
}

int main (int argc, char *argv[])
{
NSAutoreleasePool *pool = [NSAutoreleasePool new];

NSMutableArray *test = [NSMutableArray array];

int i;
for (i = 0; i < 10; i++) {
[test addObject:[NSNumber numberWithInt:(arc4random() % 100)]];
}

NSLog(@"Searching: %@", test);

NSArray *values, *indexes;
CSSearchNumberArray(test, 50, &values, &indexes);

NSLog(@"Values: %@", values);
NSLog(@"Indexes: %@", indexes);

[pool drain];
return 0;
}

关于objective-c - 在 NSArray 中搜索最近的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7195053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com