我见过几个这样的例子,但所有这些似乎都依赖于知道你想计算哪个元素的出现次数。我的数组是动态生成的,所以我无法知道我想计算哪个元素的出现次数(我想计算所有元素的出现次数)。任何人都可以建议吗?
提前致谢
编辑:
也许我应该更清楚,数组将包含多个不同的字符串(例如
["FOO", "FOO", "BAR", "FOOBAR"]
如何在事先不知道 foo、bar 和 foobar 是什么的情况下计算它们的出现次数?
最佳答案
Swift 3 和 Swift 2:
您可以使用 [String: Int]
类型的字典来为您的 [String]
中的每个项目建立计数:
let arr = ["FOO", "FOO", "BAR", "FOOBAR"]
var counts: [String: Int] = [:]
for item in arr {
counts[item] = (counts[item] ?? 0) + 1
}
print(counts) // "[BAR: 1, FOOBAR: 1, FOO: 2]"
for (key, value) in counts {
print("\(key) occurs \(value) time(s)")
}
输出:
BAR occurs 1 time(s)
FOOBAR occurs 1 time(s)
FOO occurs 2 time(s)
swift 4:
swift 4 introduces (SE-0165)能够在字典查找中包含默认值,并且可以使用 +=
和 -=
等操作改变结果值,因此:
counts[item] = (counts[item] ?? 0) + 1
变成:
counts[item, default: 0] += 1
这使得使用 forEach
在一行简洁的代码中进行计数操作变得容易:
let arr = ["FOO", "FOO", "BAR", "FOOBAR"]
var counts: [String: Int] = [:]
arr.forEach { counts[$0, default: 0] += 1 }
print(counts) // "["FOOBAR": 1, "FOO": 2, "BAR": 1]"
Swift 4:reduce(into:_:)
Swift 4 引入了新版本的 reduce
,它使用 inout
变量来累积结果。使用它,计数的创建真正变成了一行:
let arr = ["FOO", "FOO", "BAR", "FOOBAR"]
let counts = arr.reduce(into: [:]) { counts, word in counts[word, default: 0] += 1 }
print(counts) // ["BAR": 1, "FOOBAR": 1, "FOO": 2]
或者使用默认参数:
let counts = arr.reduce(into: [:]) { $0[$1, default: 0] += 1 }
最后,您可以将它作为 Sequence
的扩展,以便它可以在任何包含 Hashable
项(包括 Array)的
、Sequence
上调用ArraySlice
、String
和 String.SubSequence
:
extension Sequence where Element: Hashable {
var histogram: [Element: Int] {
return self.reduce(into: [:]) { counts, elem in counts[elem, default: 0] += 1 }
}
}
这个想法是从this question借来的尽管我将其更改为计算属性。感谢@LeoDabus 建议扩展 Sequence
而不是 Array
以获取更多类型。
示例:
print("abacab".histogram)
["a": 3, "b": 2, "c": 1]
print("Hello World!".suffix(6).histogram)
["l": 1, "!": 1, "d": 1, "o": 1, "W": 1, "r": 1]
print([1,2,3,2,1].histogram)
[2: 2, 3: 1, 1: 2]
print([1,2,3,2,1,2,1,3,4,5].prefix(8).histogram)
[1: 3, 2: 3, 3: 2]
print(stride(from: 1, through: 10, by: 2).histogram)
[1: 1, 3: 1, 5: 1, 7: 1, 9: 1]
关于ios - 如何计算 Swift 数组中元素的出现次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30545518/