我有点问题。我有一个 NSMutableDictionary,里面有 10 个 NSMutableArrays。每个数组都有 0-10 个数字,每个数字都可以是任何整数,例如 12 或 103。
我需要做的是从每个数组中获取前 10 个最高数字。问题是,我需要在字典(键)中保留它来自的数组的引用以及它形成的数组中数字的索引位置。
我有点问题。我有一个 NSMutableDictionary,里面有 10 个 NSMutableArrays。每个数组都有 0-10 个数字,每个数字都可以是任何整数,例如 12 或 103。
我需要做的是从每个数组中获取前 10 个最高数字。问题是,我需要在字典(键)中保留它来自的数组的引用以及它形成的数组中数字的索引位置。
最简单的方法,就是对数组进行降序排序,然后抓取前10个索引
或者,如果它们在字典中,则迭代字典allValues
,获取所有数组,将所有元素添加到一个公共数组中,然后对其进行排序
您必须使用“C”逻辑按降序缩短数组。这里我将根据你的情况举一个例子......
// adding 20 elements in an array, suppose this is your original array (array1).
NSMutableArray *array1 = [[NSMutableArray alloc]init];
for(int i=0;i<20;i++)
{
NSString *str = [NSString stringWithFormat:@"%d",(i*4)];
[array1 addObject:str];
}
//make a copy of your original array
NSMutableArray *array2 = [[NSMutableArray alloc]initWithArray:array1];
// this is the array which will get your sorting list
NSMutableArray *array3 = [[NSMutableArray alloc]init];
//declare an integer for compare as a maximum number and it to 0 initially
int max = 0;
// this is the logic to sort an array
for(int i=0;i<20;i++)
{
for(int j=0;j<[array2 count];j++)
{
int f = [[array2 objectAtIndex:j] intValue];
if(max<f)
{
max = f;
}
}
NSString *str = [[NSNumber numberWithInt:max]stringValue];
//max has a maximum value then add it to array3 and remove from array2
//for a new shorting
[array3 addObject:str];
[array2 removeObject:str];
// set 0 to max again
max = 0;
}
//now after all procedure print the **array3**
// and you will get all the objects in descending order,
//you can take top **10** variables from **array3**
NSLog(@"your sorting array %@", **array3**);
}
听起来像是某种家庭作业:)
所以你有这个:
NSMutableDictionary* source = [@{
@"1" : @[ @10, @20, @100 … ],
@"2" : @[ @8, @42, @17 … ]
} mutableCopy];
因此,让我们从创建另一种安排开始:
NSMutableArray* numbers = [NSMutableArray new];
for (NSArray* array in source.allValues)
{
for (NSNumber* number in array)
{
[numbers addObject: @{ @"number" : number, @"parent" : array }];
}
}
这是我们得到的:
@[
@{ @"number" : @10, @"parent" : <array> },
@{ @"number" : @20, @"parent" : <array> },
…
]
现在我们可以排序并找到您想要的数字。
[numbers sortUsingComparator: ^( id lhs, id rhs ){
return [((NSDictionary*) rhs)[@"number"] compare: ((NSDictionary*) lhs)[@"number"]];
}];
NSArray* topNumbers = [numbers subarrayWithRange: NSMakeRange( 0, 10 )];
我们到了。topNumbers 包含源数组中所需的数字。
这是一种非常幼稚的方法。它可以在 CPU 时间和内存使用方面进行相当多的优化。但是,嘿,保持简单并不是一件坏事。
未解决:如果第十和第十一个数字相等怎么办?(地址在这里:从数组中挑选出特定的数字?)范围检查。没有测试,甚至没有编译。;)
遍历数组,为每个元素创建一个对象/结构,由数字“键”值和元素的“路径”(数组索引)组成。对如此创建的对象/结构进行排序。(这被称为“标签排序”。)
另一种方法,如果您只需要前 N 个值(其中 N << 条目总数)是创建一个由 N 个元素组成的数组,由上述键和路径信息组成。扫描所有数组并将每个数组元素与当前存储的 N 个中的最小键进行比较。如果发现一个元素大于存储的最小元素,则替换存储的最小元素并对 N 个元素进行排序以选择新的最小存储元素。
您最终想要的数据结构似乎是一个对象数组,其中每个对象在功能上类似于“索引路径”,只是它由字符串(键)和值(偏移量)组成。
假设对最高数字的实际搜索没有问题,那么我建议在找到候选数字时创建这些对象之一,以便在找到前十名后,这些对象可以用作指向数字的来源位置。