在swift中过滤元素出现次数最多的数组

Ami*_*mit 3 arrays filter swift

我必须过滤一个元素出现次数最多的数组。

初始数组:

let array1 = [1,2,3,2,4,2,5,3]
let array2 = ["abc", "def", "abc", "ert", "def", "abc"]
Run Code Online (Sandbox Code Playgroud)

过滤后,最终数组:

let filteredArray1 = [2,2,2]
let filteredArray2 = ["abc","abc","abc"]
Run Code Online (Sandbox Code Playgroud)

我的想法是从这里获取元素的数量:

就像获取 "abc" 的计数一样:

array2.filter{$0 == "abc"}.count
Run Code Online (Sandbox Code Playgroud)

但是有没有办法获得过滤后的数组?

Joa*_*son 7

您可以将项目分组到字典中并比较每组中的项目数

let mostFrequent = Dictionary(grouping: array1, by: {$0})
    .max(by: {$0.value.count < $1.value.count})?.value ?? []
Run Code Online (Sandbox Code Playgroud)

上面的问题是,如果有两个或更多的值具有相同的计数,则只会选择一个。

当有多个最大计数时,以下解决方案处理,但我无法将其写为单行表达式

let dictionary = Dictionary(grouping: array1, by: {$0})
let max = dictionary.max(by: {$0.value.count < $1.value.count})?.value.count ?? 0
let mostFrequent = dictionary.filter { $0.value.count == max }.values
Run Code Online (Sandbox Code Playgroud)