我有点问题。我有一个带有10个NSMutableArrays的NSMutableDictionary。每个数组有0-10个数字,每个数字可以是任何整数,例如12或103。
我需要做的是从每个阵列中获得前10个最高数字。麻烦的是,我需要在字典(键)中保留它所来自的数组的引用,以及它来自数组的数字的索引位置。
答案 0 :(得分:4)
最简单的方法是按降序排序数组,然后获取前10个索引
或者如果它们在字典中,则迭代字典allValues
,获取所有数组,将所有元素添加到公共数组中,然后对其进行排序
答案 1 :(得分:0)
似乎你想要最终得到的数据结构是一个对象数组,其中每个对象在功能上类似于“索引路径”,除了它由一个字符串(键)和一个值(偏移量)组成
假设实际搜索的最高数字不存在问题,那么我建议您在找到候选数字时创建其中一个对象,这样一旦找到前十个,对象就可以用作-pointers到数字的源位置。
答案 2 :(得分:0)
您必须使用'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**);
}
答案 3 :(得分:0)
听起来像某种家庭作业:)
所以你有这个:
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时间和内存使用方面进行相当大的优化。但是,嘿,保持简单并不是件坏事。
没有解决:如果第十和第十一个数字相等怎么办? (在这里说:Pick Out Specific Number from Array?)范围检查。没有测试,甚至没有编译。 ;)
答案 4 :(得分:0)
遍历数组,为每个元素创建一个对象/结构,包括数字“key”值和元素的“path”(数组索引)。对如此创建的对象/结构进行排序。 (这被称为“标签排序”。)
另一种方法,如果您只需要前N个值(其中N <&lt;条目总数)是创建N个元素的数组,包括上述键和路径信息。扫描所有数组并将每个数组元素与当前存储的N的最小键进行比较。如果找到大于存储的最小元素,则替换存储的最小元素并对N个元素进行排序以选择存储的新最小值。