如何将两个数组合并到字典中?

Posted

技术标签:

【中文标题】如何将两个数组合并到字典中?【英文标题】:How can I merge two arrays into a dictionary? 【发布时间】:2015-11-15 10:29:10 【问题描述】:

我有 2 个数组:

    var identic = [String]()
    var linef = [String]()

我已经为它们附加了数据。现在出于可用性目的,我的目标是将它们全部组合成具有以下结构的字典

FullStack = ["identic 1st value":"linef first value", "identic 2nd value":"linef 2nd value"]

我一直在网上浏览,找不到可行的解决方案。

非常感谢任何想法。

谢谢!

【问题讨论】:

一切都是关于 zip,它会为您完成这些 【参考方案1】:

从 Xcode 9.0 开始,您可以这样做:

var identic = [String]()
var linef = [String]()

// Add data...

let fullStack = Dictionary(uniqueKeysWithValues: zip(identic, linef))

如果您的密钥不能保证是唯一的,请改用它:

let fullStack =
    Dictionary(zip(identic, linef), uniquingKeysWith:  (first, _) in first )

let fullStack =
    Dictionary(zip(identic, linef), uniquingKeysWith:  (_, last) in last )

文档:

https://developer.apple.com/documentation/swift/dictionary/3127165-init

https://developer.apple.com/documentation/swift/dictionary/3127161-init

【讨论】:

旧链接似乎已损坏。新链接:developer.apple.com/documentation/swift/dictionary/3127161-init【参考方案2】:

使用enumerated():

var arrayOne: [String] = []
var arrayTwo: [String] = []

var dictionary: [String: String] = [:]

for (index, element) in arrayOne.enumerated() 
    dictionary[element] = arrayTwo[index]

pro 方法是使用扩展:

extension Dictionary 
    public init(keys: [Key], values: [Value]) 
        precondition(keys.count == values.count)

        self.init()

        for (index, key) in keys.enumerate() 
            self[key] = values[index]
        
    

编辑: enumerate()enumerated() (Swift 3 → Swift 4)

【讨论】:

我将此扩展添加到我的项目中,但是当我尝试使用它初始化字典时,我没有看到初始化程序。你能添加示例用法吗? 从某种意义上说,这个答案实际上并不正确——您只需使用 zip 来做到这一点。【参考方案3】:

这是一个扩展,它结合了之前的一些答案并接受所有序列,而不仅仅是数组。

public extension Dictionary 
    init<K: Sequence, V: Sequence>(keys: K, values: V) where K.Element == Key, V.Element == Value, K.Element: Hashable 
        self.init()
        for (key, value) in zip(keys, values) 
            self[key] = value
        
    

该扩展不需要序列长度相同。如果你想要,这里有一个带有断言的扩展。

public extension Dictionary 
    init<K: Sequence, V: Sequence>(keys: K, values: V) where K.Element == Key, V.Element == Value, K.Element: Hashable 
        self.init()
        var keyIterator = keys.makeIterator()
        for value in values 
            let key = keyIterator.next()
            assert(key != nil, "The value sequence was longer.")
            self[key!] = value
        
        assert(keyIterator.next() == nil, "The key sequence was longer.")
    

【讨论】:

【参考方案4】:

一种稍微不同的方法,它不需要数组的长度相同,因为zip 函数会安全地处理它。

extension Dictionary 
    init(keys: [Key], values: [Value]) 
        self.init()

        for (key, value) in zip(keys, values) 
            self[key] = value
        
    

【讨论】:

当数组长度不同时,输出是什么? 它只将内容压缩到最短数组的长度。【参考方案5】:

如果您想更安全并确保每次都选择较小的数组计数(这样如果第二个数组小于第一个数组,您就不会崩溃),那么请执行以下操作:

var identic = ["A", "B", "C", "D"]
var linef = ["1", "2", "3"]

var Fullstack = [String: String]()
for i in 0..<min(linef.count, identic.count) 
    Fullstack[identic[i]] = linef[i]


print(Fullstack) // "[A: 1, B: 2, C: 3]"

【讨论】:

【参考方案6】:

这是一个通用的解决方案

func dictionaryFromKeysAndValues<K : Hashable, V>(keys:[K], values:[V]) -> Dictionary<K, V>

  assert((count(keys) == count(values)), "number of elements odd")
  var result = Dictionary<K, V>()
  for i in 0..<count(keys) 
    result[keys[i]] = values[i]
  
  return result


var identic = ["identic 1st value", "identic 2nd value", "identic 3rd value"]
var linef = ["linef 1st value", "linef 2nd value", "linef 3rd value"]

let mergedDictionary = dictionaryFromKeysAndValues(identic, linef)

【讨论】:

不一样,我没有使用 enumerate() 并且我的是一个不限于字符串的通用解决方案。 我的也是通用解决方案。

以上是关于如何将两个数组合并到字典中?的主要内容,如果未能解决你的问题,请参考以下文章

Java中如何把两个数组合并为一个

JAVA怎么合并两个数组

如何根据javascript中的键合并和替换两个数组中的对象?

88. Merge Sorted Arrayleetcode算法,java将两个有序数组合并到一个数组中

分治策略合并多个排序数组

华为OJ平台——整形数组合并