将 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 }
我有一个值数组,我想在其中计算每个唯一值的出现次数,然后创建一个新的按出现次数排序的唯一值数组。
例如对于数组如下:
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 }