数组中最常见的元素

时间:2013-11-21 14:13:59

标签: objective-c arrays elements

我想知道是否有人可以提供一些有效的示例代码,请选择阵列中的前3个元素?

我的数组只包含一个日期列表,我想要做的是选择其中包含的前3个日期。

我已经看到了一些返回常见元素的例子,但没有什么能让我获得前三名。

所以如果这是我的数组的内容:

01/01/2013,01/01 / 2013,01 / 01 / 2013,01 / 02 / 2013,01 / 02 / 2013,01 / 02 / 2013,01 / 03 / 2013,01 / 03/2013 ,22/05 / 2013,23 / 05 / 2013,27 / 05 / 2013,06 / 06 / 2013,07 / 07 / 2013,12 / 08/2013

然后我希望前3个日期出现:

01/01 / 2013,01 / 02 / 2013,03 / 03/2013

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

找到最多3个值的解决方案需要30分钟...

试一试:

NSArray *yourArray=@[@"01/01/2013", @"01/01/2013", @"01/01/2013", @"21/02/2013", @"01/06/2013", @"11/02/2013", @"01/03/2013", @"01/03/2013", @"22/05/2013", @"23/05/2013", @"27/05/2013", @"01/06/2013", @"07/07/2013", @"12/08/2013"];

NSCountedSet *set = [[NSCountedSet alloc] initWithArray:yourArray];

NSMutableDictionary *dict=[NSMutableDictionary new];

for (id obj in set) {
    [dict setObject:[NSNumber numberWithInteger:[set countForObject:obj]]
             forKey:obj]; //key is date
}

NSLog(@"Dict : %@", dict);

NSMutableArray *top3=[[NSMutableArray alloc]initWithCapacity:3];

//which dict obj is = max
if (dict.count>=3) {

    while (top3.count<3) {
        NSInteger max = [[[dict allValues] valueForKeyPath:@"@max.intValue"] intValue];

        for (id obj in set) {
            if (max == [dict[obj] integerValue]) {
                NSLog(@"--> %@",obj);
                [top3 addObject:obj];
                [dict removeObjectForKey:obj];
            }
        }
    }
}

NSLog(@"top 3 = %@", top3);

输出:

2013-11-21 20:50:45.475 Demo[19256:8c03] Dict : {
    "01/01/2013" = 3;
    "01/03/2013" = 2;
    "01/06/2013" = 2;
    "07/07/2013" = 1;
    "11/02/2013" = 1;
    "12/08/2013" = 1;
    "21/02/2013" = 1;
    "22/05/2013" = 1;
    "23/05/2013" = 1;
    "27/05/2013" = 1;
}
2013-11-21 20:50:45.476 Demo[19256:8c03] --> 01/01/2013
2013-11-21 20:50:45.477 Demo[19256:8c03] --> 01/03/2013
2013-11-21 20:50:45.477 Demo[19256:8c03] --> 01/06/2013
2013-11-21 20:50:45.478 Demo[19256:8c03] top 3 = (
    "01/01/2013",
    "01/03/2013",
    "01/06/2013"
)