从阵列获得十大最高数字?

时间:2012-06-24 12:49:59

标签: objective-c nsmutablearray nsmutabledictionary

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

我需要做的是从每个阵列中获得前10个最高数字。麻烦的是,我需要在字典(键)中保留它所来自的数组的引用,以及它来自数组的数字的索引位置。

5 个答案:

答案 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个元素进行排序以选择存储的新最小值。