1

我有点问题。我有一个 NSMutableDictionary,里面有 10 个 NSMutableArrays。每个数组都有 0-10 个数字,每个数字都可以是任何整数,例如 12 或 103。

我需要做的是从每个数组中获取前 10 个最高数字。问题是,我需要在字典(键)中保留它来自的数组的引用以及它形成的数组中数字的索引位置。

4

5 回答 5

4

最简单的方法,就是对数组进行降序排序,然后抓取前10个索引

或者,如果它们在字典中,则迭代字典allValues,获取所有数组,将所有元素添加到一个公共数组中,然后对其进行排序

于 2012-06-24T13:00:37.863 回答
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**);
}
于 2012-06-24T13:15:07.703 回答
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 时间和内存使用方面进行相当多的优化。但是,嘿,保持简单并不是一件坏事。

未解决:如果第十和第十一个数字相等怎么办?(地址在这里:从数组中挑选出特定的数字?)范围检查。没有测试,甚至没有编译。;)

于 2012-06-24T13:15:37.090 回答
0

遍历数组,为每个元素创建一个对象/结构,由数字“键”值和元素的“路径”(数组索引)组成。对如此创建的对象/结构进行排序。(这被称为“标签排序”。)

另一种方法,如果您只需要前 N 个值(其中 N << 条目总数)是创建一个由 N 个元素组成的数组,由上述键和路径信息组成。扫描所有数组并将每个数组元素与当前存储的 N 个中的最小键进行比较。如果发现一个元素大于存储的最小元素,则替换存储的最小元素并对 N 个元素进行排序以选择新的最小存储元素。

于 2012-06-24T14:04:54.340 回答
0

您最终想要的数据结构似乎是一个对象数组,其中每个对象在功能上类似于“索引路径”,只是它由字符串(键)和值(偏移量)组成。

假设对最高数字的实际搜索没有问题,那么我建议在找到候选数字时创建这些对象之一,以便在找到前十名后,这些对象可以用作指向数字的来源位置。

于 2012-06-24T12:59:46.920 回答