亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何計算Swift數組中元素的出現次數?

如何計算Swift數組中元素的出現次數?

森林海 2019-09-21 15:42:39
我已經看到了一些這樣的示例,但是所有這些似乎都依賴于知道要計算發生次數的元素。我的數組是動態生成的,所以我無法知道要計算哪個元素的出現(我想計算所有元素的出現)。有人可以建議嗎?提前致謝編輯:也許我應該更清楚一點,數組將包含多個不同的字符串(例如 ["FOO", "FOO", "BAR", "FOOBAR"]我如何在不知道它們是什么的情況下計算foo,bar和foobar的出現?
查看完整描述

3 回答

?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

使用Swift 5時,您可以根據需要選擇以下7個Playground示例代碼之一來計算數組中可哈希項的出現次數。


#1。使用Array的reduce(into:_:)和Dictionary的subscript(_:default:)標

let array = [4, 23, 97, 97, 97, 23]

let dictionary = array.reduce(into: [:]) { counts, number in

    counts[number, default: 0] += 1

}

print(dictionary) // [4: 1, 23: 2, 97: 3]

#2。使用repeatElement(_:count:)函數,zip(_:_:)函數和Dictionary的init(_:uniquingKeysWith:)初始值設定項

let array = [4, 23, 97, 97, 97, 23]


let repeated = repeatElement(1, count: array.count)

//let repeated = Array(repeating: 1, count: array.count) // also works


let zipSequence = zip(array, repeated)


let dictionary = Dictionary(zipSequence, uniquingKeysWith: { (current, new) in

    return current + new

})

//let dictionary = Dictionary(zipSequence, uniquingKeysWith: +) // also works


print(dictionary) // prints [4: 1, 23: 2, 97: 3]

#3。使用Dictionary的init(grouping:by:)初始值設定項和mapValues(_:)方法

let array = [4, 23, 97, 97, 97, 23]


let dictionary = Dictionary(grouping: array, by: { $0 })


let newDictionary = dictionary.mapValues { (value: [Int]) in

    return value.count

}


print(newDictionary) // prints: [97: 3, 23: 2, 4: 1]

#4。使用Dictionary的init(grouping:by:)初始值設定項和map(_:)方法

let array = [4, 23, 97, 97, 97, 23]


let dictionary = Dictionary(grouping: array, by: { $0 })


let newArray = dictionary.map { (key: Int, value: [Int]) in

    return (key, value.count)

}


print(newArray) // prints: [(4, 1), (23, 2), (97, 3)]

#5。使用for循環和Dictionary的subscript(_:)下標

extension Array where Element: Hashable {


    func countForElements() -> [Element: Int] {

        var counts = [Element: Int]()

        for element in self {

            counts[element] = (counts[element] ?? 0) + 1

        }

        return counts

    }


}


let array = [4, 23, 97, 97, 97, 23]

print(array.countForElements()) // prints [4: 1, 23: 2, 97: 3]

#6。使用NSCountedSet和NSEnumerator的map(_:)方法(需要Foundation)

import Foundation


extension Array where Element: Hashable {


    func countForElements() -> [(Element, Int)] {

        let countedSet = NSCountedSet(array: self)

        let res = countedSet.objectEnumerator().map { (object: Any) -> (Element, Int) in

            return (object as! Element, countedSet.count(for: object))

        }

        return res

    }


}


let array = [4, 23, 97, 97, 97, 23]

print(array.countForElements()) // prints [(97, 3), (4, 1), (23, 2)]

#7。使用NSCountedSet和AnyIterator(需要Foundation)

import Foundation


extension Array where Element: Hashable {


    func counForElements() -> Array<(Element, Int)> {

        let countedSet = NSCountedSet(array: self)

        var countedSetIterator = countedSet.objectEnumerator().makeIterator()

        let anyIterator = AnyIterator<(Element, Int)> {

            guard let element = countedSetIterator.next() as? Element else { return nil }

            return (element, countedSet.count(for: element))

        }

        return Array<(Element, Int)>(anyIterator)

    }


}


let array = [4, 23, 97, 97, 97, 23]

print(array.counForElements()) // [(97, 3), (4, 1), (23, 2)]


查看完整回答
反對 回復 2019-09-21
  • 3 回答
  • 0 關注
  • 1141 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號