当前位置: 首页 > 面试题库 >

如何计算Swift数组中元素的出现次数?

慕容成和
2023-03-14
问题内容

我已经看到了一些这样的示例,但是所有这些似乎都依赖于知道要计算发生次数的元素。我的数组是动态生成的,所以我无法知道要计算哪个元素的出现(我想计算所有元素的出现)。有人可以建议吗?

提前致谢

编辑:

也许我应该更清楚一点,数组将包含多个不同的字符串(例如 ["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)

斯威夫特4:

Swift 4 引入了(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]"

斯威夫特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 }

最后,您可以将其扩展为,Array以便可以在包含Hashable项的任何数组上调用它:

extension Array where Element: Hashable {
    var histogram: [Element: Int] {
        return self.reduce(into: [:]) { counts, elem in counts[elem, default: 0] += 1 }
    }
}


 类似资料:
  • 问题内容: 在Javascript中,我试图获取数字值的初始数组并计算其中的元素。理想情况下,结果将是两个新数组,第一个数组指定每个唯一元素,第二个数组包含每个元素出现的次数。但是,我愿意接受有关输出格式的建议。 例如,如果初始数组为: 然后将创建两个新的数组。第一个将包含每个唯一元素的名称: 第二个将包含元素在初始数组中出现的次数: 因为数字5在初始数组中出现3次,所以数字2出现5次,而9和4都

  • 问题内容: 我有一个的类,如下所示: 如你所见,包含3个元素和一个元素。我想知道Collection框架中是否有任何API可以返回出现次数,bat或者是否有其他方法可以确定出现次数。 我发现Google的Collection 确实有一个API,该API返回一个元素出现的总数。但这仅与JDK 1.5兼容。我们的产品当前在JDK 1.6中,因此我无法使用它。 问题答案: 我很确定中的静态频率方法会派上

  • 我有一个任务,它获取一个int值“n”和一个Int Array作为参数,并且应该返回一个布尔值。该方法应该确定给定数组中有多少个“n”。如果数字是偶数,则方法应该返回true,否则返回false。如果数组的长度为0,它也应该返回“false”。 我设法做到的是: 老实说,我真的很困惑,我不知道该怎么办。我真的已经尽力了,但是我在这项任务上工作的时间越长,我就越不理解。感谢任何帮助,并提前感谢您!:

  • 问题内容: 给定一个包含重复项的整数排序数组。查找数组中存在的每个唯一元素的频率。 频率定义为数组中任何元素出现的次数。 例如 : 问题答案: 我们首先讨论divide and conquer解决这个问题的基本策略。 每次调用我们的函数时,我们将数组分成两半,每次将我们的问题分成两半,导致最坏的时间复杂度为O(log(n))。 我们的数组实际上并没有被分成两半,但是我们保留了两个指针 start

  • 问题内容: 说我有阵列 数组的长度为20,但计数为0。如何获取计数? 问题答案: “计数”是什么意思?具有非零值的元素数量?您只需要数一下。 有 没有区别 数组和一个已之间 明确地 设置与零个值。例如,这些数组是无法区分的: Java中的数组始终具有固定大小-可通过字段访问。没有“当前使用的阵列数量”的概念。

  • 我已经被设置了一个任务,这意味着我需要创建一个'3个或更多的骰子游戏‘。我所坚持的是这个游戏所需要的计分系统,它是这样的:“玩家依次掷出所有五个骰子,并为同类中的三个或更好的骰子得分。如果玩家只有同类中的两个,他们可能会重新掷出剩余的骰子,试图提高匹配的骰子值。如果没有匹配的数字被掷出,玩家得分为0。 游戏进行了一定数量的回合(比如50回合),游戏结束时总分最高的玩家是获胜者。“我需要计算出如何将