2013-11-21 141 views
-3

我想知道是否有人能夠提供給我一些有效的示例代碼,請選擇數組中的前3個元素?排列中最常見的元素

我的數組只包含一個日期列表,我想要做的是選擇包含在其中的前3個日期。

我見過一些返回常見元素的例子,但沒有什麼會給我一個前3名單。

因此,如果這是我的數組的內容:

2013年1月1日,2013年1月1日,2013年1月1日,2013年1月2日,2013年1月2日,01/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

那麼我預計前3日期出來爲:

2013年1月1日,2013年1月2日,2013年1月3日

任何幫助將非常感激。

+0

您可以創建的NSSet,然後循環直到計數出現... –

+0

這些日期('NSDate'對象)或字符串('NSString'對象)? – trojanfoe

+1

-1你用錯誤的需求描述誤導了我。根據你的個人資料,我應該預料到這一點:-)「我想要做的是挑選前三名日期」是不明確的。 – trojanfoe

回答

0

花了30分鐘找到一個解決方案,找到最多3個值...

有一個嘗試:

NSArray *[email protected][@"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" 
)