【问题标题】:Combine two arrays to one dictionary in Swift在 Swift 中将两个数组合并为一个字典
【发布时间】:2021-05-12 13:55:59
【问题描述】:

我有两个数组:

let data = ["12 Mai 2021", "12 Mai 2021"]
let prices = [45.0, 50.0]

现在我想将这两个转换为一个字典,如下所示:

["12 Mai 2021":45.0, "12 Mai 2021":50.0]

如果输出可以是:

[("12 Mai 2021",45.0),("12 Mai 2021",50.0)]

但我不知道这是否可能...... 在这个板上,我已经偶然发现了“zip”解决方案,如下所示:

var dictionary = [String: Double]()
zip(data, prices).forEach { dictionary[$0] = $1 }
print(dictionary)

但这只是打印出来的:

["12 Mai 2021": 50.0]

有人知道可行的解决方案吗?提前谢谢!

【问题讨论】:

  • 12 Mai 2021 是同一日期。第二个将覆盖第一个。
  • 在字典中,键是唯一的,这就是你有“问题”的原因。 ["12 Mai 2021":45.0, "12 Mai 2021":50.0] 不存在。
  • zip(data, prices).map({ ($0.0, $0.1) }) ?
  • Larne 非常感谢您解决了这两个问题!
  • @Larme map 后面的 zip 是不需要的。 zip 已经返回了 map 正在创建的相同元组!

标签: ios swift iphone xcode


【解决方案1】:

你说你想要这个Dictionary

["12 Mai 2021":45.0, "12 Mai 2021":50.0]

但那是不可能的。 Dictionary 中的每个键都必须是唯一的。密钥"12 Mai 2021" 不能使用两次。

然后你说你更喜欢这个“输出”:

[("12 Mai 2021",45.0),("12 Mai 2021",50.0)]

这是一组对(2 元组),您可以使用 zip 得到答案:

let pairs = zip(data, prices).map { $0 }
// Type of pairs is [(String, Double)].

如果您真的想要Dictionary,那么您必须决定如何处理重复键。也许您希望每个日期键映射到该日期价格的 array。这是一种方法:

let d = Dictionary(zip(data, prices.map { [$0] })) { $0 + $1 }
// Result: ["12 Mai 2021": [45.0, 50.0]]

上面的代码就是这样做的。

  1. prices.map { [$0] }prices[Double] 转换为[[Double]],即转换为Double 的数组数组,其中每个内部数组仅包含一个价格:[[45.0], [50.0]]

  2. zip 将日期和单价数组组合成对:[("12 Mai 2021", [45.0]), ("12 Mai 2021", [50.0])]

  3. Dictionary 初始化程序将数组对转换为 [String: [Double]]。当它找到重复键时,它使用闭包{ $0 + $1 } 组合相应的值。这里,$0$1 都是 [Double],所以闭包连接了数组。

【讨论】:

  • 字典初始化程序中缺少右括号。另一种选择是将+ 运算符作为uniquingKeysWith 参数Dictionary(zip(data, prices.map { [$0] }), uniquingKeysWith: +)
  • 我添加了缺少的关闭括号。这就是您不复制和粘贴代码时会发生的情况。
猜你喜欢
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 2017-07-23
  • 2018-05-13
相关资源
最近更新 更多