为了账号安全,请及时绑定邮箱和手机立即绑定

如何计算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 关注
  • 1097 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信