2013-10-27 71 views

回答

7
NSCountedSet *countedSet = [[NSCountedSet alloc] initWithArray:array2]; 

    NSMutableArray *dictArray = [NSMutableArray array]; 
    [countedSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { 
     [dictArray addObject:@{@"object": obj, 
           @"count": @([countedSet countForObject:obj])}]; 
    }]; 

    NSLog(@"Objects sorted by count: %@", [dictArray sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"count" ascending:NO]]]); 

在上面的代碼,array2是100個隨機串,每個的陣列以兩個字母。 sortedArrayUsingDescriptors:,返回一個排序數組,在​​這種情況下,它按照對象的數量降序排列。

7

這裏是另一種方式來達到同樣的效果:

NSArray *sortedValues = [countedSet.allObjects sortedArrayUsingComparator:^(id obj1, id obj2) { 
    NSUInteger n = [countedSet countForObject:obj1]; 
    NSUInteger m = [countedSet countForObject:obj2]; 
    return (n <= m)? (n < m)? NSOrderedAscending : NSOrderedSame : NSOrderedDescending; 
}]; 

要獲得降序排列,你可以使用的值(或逆轉上述返回值)。

sortedValues.reverseObjectEnumerator.allObjects 
+2

如果你改變'return(n <= m)? (n Filowk

+0

這是一個很好的答案,但我更喜歡對每個countForObject值使用'NSNumber'實例,然後僅返回這些的「compare」結果。 –

1

這裏是一個斯威夫特版本:

let sorted = countedSet.allObjects.sort { return countedSet.countForObject($0.0) < countedSet.countForObject($0.1) } 

只要改變<>降序排序

2

對於Swift3您需要修改所提供的SWIFT代碼位:

let countedSet = [1,2,2,4,6,7,8,8,5,8,1] 

let sorted = countedSet.allObjects.sorted { return countedSet.count(for: $0.0) > countedSet.count(for: $0.1) } 

// iterate over all items in the set 
for item in countedSet { 
    print("\(item): Count - \(countedSet.count(for: item))") 
} 
+1

'bag'參考是怎麼回事?你能澄清嗎? – Adrian

+0

對不起,我用其他變量名稱測試了代碼,並將該變量重命名爲錯誤;-)它修改了代碼。謝謝! – Lepidopteron