我有一个对象数组的数组。内部数组已按顺序排序,然后添加到整个数组中。所有内部对象都具有不同的值。
我正在尝试浏览这些数组,并按照平均索引值的顺序组织对象。
内部数组排序的示例
obj 1 | obj 2 | obj 2
obj 2 | obj 1 | obj 1
obj 3 | obj 3 | obj 4
obj 4 | obj 4 | obj 3
然后在获得平均值之后我需要的输出
obj 2
obj 1
obj 3
obj 4
我真的只需要前三个指数平均值,但我想得到所有这些。所以例如得到3我可以做到这一点
for (NSArray* innerArray in outterArray) {
for (NSString* str in innerArray) {
if ([innerArray indexOfObject:str] == 0) {
[first addObject:str];
}else if([innerArray indexOfObject:str] == 1){
[second addObject:str];
}else if ([innerArray indexOfObject:str] == 2){
[third addObject:str];
}
}
}
然后浏览这三个数组并查看弹出的位置,但必须有一个更好的方法来做这个,它可能很简单,但我看不到它
答案 0 :(得分:1)
所有对象出现的次数相同,因此您可以计算总和 索引而不是每个对象的平均值。
这可以通过在所有内部词典上枚举一次并进行更新来完成
哈希映射(字典),包含当前对象的索引总和。
(请注意indexOfObject:
这里不需要在内部数组中找到对象。)
然后根据索引的总和(即值)对对象进行排序 字典中的对象):
NSArray *outerArray = @[
@[@"obj 1", @"obj 2", @"obj 3", @"obj 4"],
@[@"obj 2", @"obj 1", @"obj 3", @"obj 4"],
@[@"obj 2", @"obj 1", @"obj 4", @"obj 3"],
];
NSMutableDictionary *map = [NSMutableDictionary dictionary];
for (NSArray *innerArray in outerArray) {
NSUInteger index = 0; // Index of next object in the inner array
for (NSString *str in innerArray) {
// Add current index of this object to previous sum and update hash map
NSUInteger tmp = index + [map[str] unsignedIntegerValue];
map[str] = @(tmp);
index++;
}
}
NSArray *sorted = [[map allKeys] sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
return [map[obj1] compare:map[obj2]];
}];
NSLog(@"%@", sorted);
输出:
(
"obj 2",
"obj 1",
"obj 3",
"obj 4"
)
本案例中的字典map
是
{
"obj 1" = 2; // "obj 1" at indices 0 + 1 + 1
"obj 2" = 1; // "obj 2" at indices 1 + 0 + 0
"obj 3" = 7; // "obj 3" at indices 2 + 2 + 3
"obj 4" = 8; // "obj 4" at indices 3 + 3 + 2
}