将 NSArray 转换为按 Objective-C 或 Swift 中的频率排序的唯一值数组

Convert NSArray into Array of unique values sorted by frequency in Objective-C or Swift

我有一个值数组,我想在其中计算每个唯一值的出现次数,然后创建一个新的按出现次数排序的唯一值数组。

例如对于数组如下:

 vals = {0,0,0,2,0,1,2}

我想以 {0,2,1} 数组结束,因为 0 是最常见的值,2 是第二常见的值,1 是最不常见的值。请注意,这些是数字这一事实是无关紧要的。它们可以很容易地成为字符串。

我想我可以使用 nssortdescriptor,如下所示:

NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"wordCount" ascending:NO];
NSArray *sortedcats = [vals sortedArrayUsingDescriptors:@[sorter]];

但是,这不是按发生率对它们进行排序,也不会过滤掉重复项。

感谢您的任何建议。

有几种方法

转换为 Set/NSSet 然后排序。

Swift

let vals = [0,0,0,2,0,1,2]
let uniqued = Set(vals).sorted()

同样的方法也适用于 NSSet + NSSortDescriptor in Objective C 但显然要写更长的一行。

或更经典的 Foundation 方法

let nsvals: NSArray = [3,0,0,2,0,1,2]
let nsuniquedAndSorted = nsvals.value(forKeyPath: "@distinctUnionOfObjects.self")

这很酷,因为 @distinctUnionOfObjects 也可以免费分类。同样有很多聪明的键值技巧 here

编辑

要按发生率排序,一种方法可能是计算唯一性,然后在此基础上求助。

let sortedByIncidence = uniqued
    .map { outer in return (outer, vals.filter({[=12=] == outer}).count) }
    .sorted { [=12=].1 > .1 }
    .map { [=12=].0 }