【问题标题】:How to get keys and values from dictionary in same order? [duplicate]如何以相同的顺序从字典中获取键和值? [复制]
【发布时间】:2021-06-21 12:55:08
【问题描述】:

我正在使用字典来存储键值对。它正确存储了 kay-value 对。但是当我尝试分别检索所有键和所有值时,它的打印方式不同。

这是一个例子,

    var sampleDic:[String:Any] = [:]
    sampleDic["one"] =  1
    sampleDic["two"] =  2
    sampleDic["three"] =  3

    print("keys: \(sampleDic.keys)")
    print("Values: \(sampleDic.values)")

有时是它的指纹,

 keys: ["one", "two", "three"]
 Values: [1, 2, 3]

有时还有它的印记,

keys: ["three", "one", "two"]
Values: [3, 1, 2]

每次运行代码时,我都会得到不同的输出。

如何始终以相同的顺序获得键和值的输出。键和值都必须根据它们在字典中存储的键/值打印在数组中。

如果字典无法做到这一点,那么是否有另一种方法来存储和获取这样的值?

【问题讨论】:

  • Array(sampleDic)(这是一个键值对数组)对您来说是否足够好?或者你想要正好 2 个数组?
  • Array(sampleDic) - 这也行不通,每次都会给出不同的输出。我实际上需要 2 个数组,一个用于键,一个用于值。
  • Here 你可以了解更多关于 Swift 中的字典类型。只有你知道你想要你的价值观的顺序,所以很难理解你想要什么解决方案。
  • samo, samo... 你做不到。阅读类似的主题。
  • @MKiOS 你需要的是一个数组和一个带有键/值属性的结构

标签: arrays swift swift-dictionary


【解决方案1】:

字典存储键和值之间的映射,而不是键值对的列表,因此没有顺序。

如果你想要一个订单,你可以通过对键值对进行排序来一个订单,例如按键

ket kvp = Array(sampelDic).sorted { $0.key < $1.key }

这会产生一个[(String, Any)]。如果你真的想要一个[String] 和一个[Any],你可以写一个unzip 函数(来自answer by Rob):

func unzip<K, V>(_ array: [(key: K, value: V)]) -> ([K], [V]) {
    var keys = [K]()
    var values = [V]()

    keys.reserveCapacity(array.count)
    values.reserveCapacity(array.count)

    array.forEach { key, value in
        keys.append(key)
        values.append(value)
    }

    return (keys, values)
}

现在你可以这样做了:

let (keys, values) = unzip(kvp)
print("Keys:", keys)
print("Values:", values)

【讨论】:

  • 其打印如下输出,键:["one", "three", "two"] 值:[1, 3, 2]
  • @MKiOS 它会总是打印出来。这不是你想要的吗?我引用:“键和值总是以相同的顺序”
猜你喜欢
  • 2021-02-10
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2019-05-11
  • 2016-06-24
  • 2023-02-04
  • 2021-03-10
  • 1970-01-01
相关资源
最近更新 更多