ios - 如何计算 Swift 数组中某个元素的出现次数?

标签 ios arrays swift nsarray

我见过一些这样的例子,但所有这些似乎都依赖于知道你想要计算哪个元素的出现次数。我的数组是动态生成的,所以我无法知道我想要计算哪个元素的出现次数(我想计算所有元素的出现次数)。谁能给点建议吗?

编辑:

也许我应该更清楚,该数组将包含多个不同的字符串(例如 [“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:减少(变成:_:)

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 上调用它ArraySliceStringString.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/40614865/

相关文章:

ios - 超高优先级后台工作或 QUARTZ 精度

ios - View 更改后下推 TableView

ios - Swift 将 NSNumber 对象转换为 Double

java - 使用数组中的字符串和 int 进行排序

ios - 在 Swift 中保存为用户默认值

ios - 如何更改等待 SKScene 运行的 SKAction 的持续时间?

iphone - RKObjectMapping 中的混淆设置映射 - Rest

ios - 从数组循环时将标签分配给 UIButton

ios - URLSessionDataTask没有成员 'map' Swift 5

c - 数组分配后 scanf 挂起...0.o?