一尘不染

获取数组的最频繁值

swift

我有一个数字数组,我想知道该数组中哪个数字最常见。数组有时有5-6个整数,有时有10-12个,有时甚至更多-
数组中的整数也可以不同。因此,我需要一个可以与数组的不同长度和值一起使用的函数。

一个例子:

myArray = [0, 0, 0, 1, 1]

另一个例子:

myArray = [4, 4, 4, 3, 3, 3, 4, 6, 6, 5, 5, 2]

现在,我正在寻找一个给出0(在第一个示例中)的函数Integer,因为它在此数组中是3倍,而数组中的另一个整数(1)在数组中仅是2倍。或第二个例子是4。

看起来很简单,但是我找不到解决方案。在网上找到了一些示例,其中的解决方案是使用字典或简单的解决方案-但我似乎无法在Swift 3中使用它…

但是,我没有找到适合我的解决方案。有人知道如何获取整数数组中最频繁的整数?


阅读 278

收藏
2020-07-07

共1个答案

一尘不染

let myArray = [4, 4, 4, 3, 3, 3, 4, 6, 6, 5, 5, 2]

// Create dictionary to map value to count   
var counts = [Int: Int]()

// Count the values with using forEach    
myArray.forEach { counts[$0] = (counts[$0] ?? 0) + 1 }

// Find the most frequent value and its count with max(by:)    
if let (value, count) = counts.max(by: {$0.1 < $1.1}) {
    print("\(value) occurs \(count) times")
}

输出:

4 occurs 4 times

这是一个函数:

func mostFrequent(array: [Int]) -> (value: Int, count: Int)? {
    var counts = [Int: Int]()

    array.forEach { counts[$0] = (counts[$0] ?? 0) + 1 }

    if let (value, count) = counts.max(by: {$0.1 < $1.1}) {
        return (value, count)
    }

    // array was empty
    return nil
}

if let result = mostFrequent(array: [1, 3, 2, 1, 1, 4, 5]) {
    print("\(result.value) occurs \(result.count) times")    
}
1 occurs 3 times

Swift 4更新:

Swift
4引入reduce(into:_:)了数组查找的默认值,并允许您在一条有效的行中生成频率。我们也可以使其通用,并使其适用于以下任何类型Hashable

func mostFrequent<T: Hashable>(array: [T]) -> (value: T, count: Int)? {

    let counts = array.reduce(into: [:]) { $0[$1, default: 0] += 1 }

    if let (value, count) = counts.max(by: { $0.1 < $1.1 }) {
        return (value, count)
    }

    // array was empty
    return nil
}

if let result = mostFrequent(array: ["a", "b", "a", "c", "a", "b"]) {
    print("\(result.value) occurs \(result.count) times")
}
a occurs 3 times
2020-07-07