获取数组数组中对象的平均索引

时间:2014-08-13 18:38:44

标签: ios objective-c arrays nssortdescriptor

我有一个对象数组的数组。内部数组已按顺序排序,然后添加到整个数组中。所有内部对象都具有不同的值。

我正在尝试浏览这些数组,并按照平均索引值的顺序组织对象。

内部数组排序的示例

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];

                }


            }
        }

然后浏览这三个数组并查看弹出的位置,但必须有一个更好的方法来做这个,它可能很简单,但我看不到它

1 个答案:

答案 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
}