Как рассчитать все режимы массива в Swift 4? - PullRequest
0 голосов
/ 01 июня 2018

Код, который я использую сейчас, дает только один режим, но не дает оба, если есть 2 режима.

func Mode() -> Float {
    var occurances: [Int: Int] = [:]
    for number in array {
        if var value = occurances[number] {
            occurances[number] = value + 1
            } else {
                occurances[number] = 1
            }
        }
    var highestKeyPair: (key: Int, value: Int) = (0,0)
    for (key,value) in occurances {
        highestKeyPair = (value > highestKeyPair.value) ? (key,value): highestKeyPair
    }
    let mode = highestKeyPair.key
    return Float(mode)
}

1 Ответ

0 голосов
/ 01 июня 2018
  1. Ваша функция использовала переменную array, доступ к которой осуществляется из глобальной области видимости.Это очень ограничено, поэтому я переместил эти методы в расширение Array.Таким образом, эти методы можно вызывать для любого массива с любым совместимым типом элементов.
  2. Я сделал все это универсальным.
  3. Я извлек первые 8 строк вашей функции в собственный метод countOccurrences().Я повторно реализовал его, используя Array.reduce(into:) и Dictionary.subscript(_:default)

Вот как я это реализовал:

extension Array where Element: Hashable {
    func countOccurrences() -> [Element: Int] {
        return self.reduce(into: [:]) { (occurences, element) in occurences[element, default: 0] += 1}
    }

    func mode() -> [Element] {
        // Keeps track of the fist mode's num occurences.
        // Every other element with the same number of occurences is also a mode.
        var firstModeNumOccurences: Int? = nil

        let modes = countOccurrences()
            .sorted { pairA, pairB in pairA.value > pairB.value } // sorting in descending order of num occurences
            .lazy
            .prefix(while:) { (element, numOccurences) in  // Take all elements with the same num occurences
                if firstModeNumOccurences == nil { firstModeNumOccurences = numOccurences }
                return numOccurences == firstModeNumOccurences
            }
            .map { (element, _) in element } // keep only the elements, not their counts

        return Array(modes)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...