【问题标题】:how to combine two dictionary values as a key and value pair in swift如何在swift中将两个字典值组合为键和值对
【发布时间】:2017-10-09 20:33:24
【问题描述】:
let arra = ["abc","def","abc","def"]
let arra2 = ["addr1","addr2","addr1","addr2"]

预期输出

dic = ["abc":"addr1","addr1" , def: "addr2","addr2"]

【问题讨论】:

  • 您提供的输出字典格式错误。你的意思是dic = ["abc": "addr1", "def": "addr2"]
  • 您的“预期输出”是一些奇怪(无效)的语法,它是一半字典和一半数组。你能澄清一下你的确切意思吗?
  • 请编辑您的问题并修正预期的输出。你的意思可能是["abc":["addr1","addr1"],"def": ["addr2","addr2"]]

标签: arrays swift dictionary


【解决方案1】:

Swift 4 的新 Dictionary 初始化器让您可以轻松地做这种事情:

let arra = ["abc","def","abc","def"]
let arra2 = ["addr1","addr2","addr1","addr2"]

let dict = [String:[String]](zip(arra,arra2.map{[$0]}),uniquingKeysWith:+)

print(dict) // ["abc": ["addr1", "addr1"], "def": ["addr2", "addr2"]]

[编辑] Swift 3 等效:

var dict : [String:[String]] = [:]
zip(arra,arra2.map{[$0]}).forEach{ dict[$0] = (dict[$0] ?? []) + $1 }

【讨论】:

  • 不错。诀窍是将每个数组元素映射到单个元素数组。
  • 你能在 swift 3 中做吗?
【解决方案2】:

应该有更简单的方法,但一般来说:

import UIKit

let keyArray = ["abc","def","abc","def"]
let valueArray = ["addr1","addr2","addr1","addr2"]

let setFromKeyArray = Set(keyArray)

var finalDict = [String: [String]]()
for index in 0..<keyArray.count {
    if let _ = finalDict[keyArray[index]] {
        finalDict[keyArray[index]]!.append(valueArray[index])
    } else {
        finalDict[keyArray[index]] = [valueArray[index]]
    }
}

print(finalDict)
// output: ["abc": ["addr1", "addr1"], "def": ["addr2", "addr2"]]

【讨论】:

    【解决方案3】:

    使用zip(_:_:)reduce(_:_:)

    let array1 = ["abc", "def", "abc", "def"]
    let array2 = ["addr1", "addr2", "addr1", "addr2"]
    
    let dictionary = zip(array1, array2).reduce([String: String]()) {
      var dictionary = $0
    
      dictionary[$1.0] = $1.1
    
      return dictionary
    }
    
    print(dictionary) // ["abc": "addr1", "def": "addr2"]
    

    【讨论】:

      【解决方案4】:

      你可以像下面这样使用:

      let arra = ["abc","def","abc","def"]
      let arra2 = ["addr1","addr2","addr1","addr2"]
      
      var dictionary: [String: String] = [:]
      dictionary.merge(zip(arra, arra2)) { (old, new) -> String in
          return "\(old), \(new)"
      }
      
      print(dictionary)
      

      输出:

      ["abc": "addr1, addr1", "def": "addr2, addr2"]
      

      【讨论】:

      • .merge 无法进入 swift 3
      【解决方案5】:

      DennisKristijanAlain 中的佼佼者。

      let arra = ["abc", "def", "abc", "def"]
      let arra2 = ["addr1", "addr2", "addr1", "addr2"]
      
      let dict = zip(arra, arra2).reduce([String:[String]]()){
          var d = $0
          d[$1.0] = ($0[$1.0] ?? []) + [$1.1]
          return d
      }
      
      print(dict) // ["def": ["addr2", "addr2"], "abc": ["addr1", "addr1"]]
      

      记住字典是无序的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多