NSCountedSet按计数排序

Cho*_*oli 9 objective-c ios nscountedset

有谁知道如何获取NSCountedSet对象并按其对象计数按顺序创建这些对象的数组?(最高计数到最低)

Pet*_*oti 8

    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]]]);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,array2是一个包含100个随机字符串的数组,每个字符串有两个字母.sortedArrayUsingDescriptors:,返回一个有序数组,在​​这种情况下,它按对象计数的降序排序.


aLe*_*ion 8

这是获得相同结果的另一种方法:

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;
}];
Run Code Online (Sandbox Code Playgroud)

要按降序获取值,您可以使用(或反转上面的返回值).

sortedValues.reverseObjectEnumerator.allObjects
Run Code Online (Sandbox Code Playgroud)

  • 如果改变`return(n <= m)?(n <m)?NSOrderedAscending:NSOrderedSame:NSOrderedDescending;`for`return(n <= m)?(n <m)?NSOrderedDescending:NSOrderedSame:NSOrderedAscending;`你得到最高到最低. (2认同)

Lep*_*ron 5

对于 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))")
}
Run Code Online (Sandbox Code Playgroud)

  • `bag` 引用是怎么回事?你能澄清一下吗? (3认同)