arrays - 如何以相同的顺序从字典中获取键和值?
问题描述
我正在使用字典来存储键值对。它正确存储了 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]
每次,每当我运行代码时,我都会得到不同的输出。
如何始终以相同的顺序获得键和值的输出。键和值都必须根据它们在字典中存储的键/值打印在数组中。
如果字典无法做到这一点,那么是否有另一种方法来存储和获取这样的值?
解决方案
字典存储键和值之间的映射,而不是键值对的列表,因此没有顺序。
如果你想要一个订单,你可以通过对键值对进行排序来给它一个,例如通过键
ket kvp = Array(sampelDic).sorted { $0.key < $1.key }
这会产生一个[(String, Any)]
. 如果你真的想要 a[String]
和 a [Any]
,你可以写一个unzip
函数(来自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)
推荐阅读
- c# - 使用 modbus rtu 并在 c# 中读取保存值
- oracle - oracle forms 12. 如何显示十进制数的前导零
- ionic-framework - 如何从代码中关闭 Ionic 5 应用程序?
- pandas - pandas grouby 根据多个条件对日期时间列进行计数
- javascript - 自动完成中的 React Material UI 打开模式失去焦点
- java - 此查询中的 sql 语法错误是什么?
- c - 如何使用 GResource 在 Gtk3 中加载图标
- c# - 使用泛型 C# 使用 where 子句进行选择
- php - TDD:模拟对象堆栈的最佳实践
- mysql - 在查询构建器中实现 SQL 时出现问题