Swift 中的有序地图
Ordered map in Swift
在Swift 2 中是否有任何内置 方法来创建有序地图?数组 [T]
按对象附加到它的顺序排序,但字典 [K : V]
未排序。
例如
var myArray: [String] = []
myArray.append("val1")
myArray.append("val2")
myArray.append("val3")
//will always print "val1, val2, val3"
print(myArray)
var myDictionary: [String : String] = [:]
myDictionary["key1"] = "val1"
myDictionary["key2"] = "val2"
myDictionary["key3"] = "val3"
//Will print "[key1: val1, key3: val3, key2: val2]"
//instead of "[key1: val1, key2: val2, key3: val3]"
print(myDictionary)
是否有任何内置方法可以创建有序的 key : value
地图,其排序方式与数组相同,还是我必须创建自己的 class?
我想尽可能避免创建自己的 class,因为 Swift 包含的内容很可能会更有效率。
Swift 不包含任何内置的有序字典功能,据我所知,Swift 2 也不包含
然后您将创建自己的。您可以查看这些教程以获取帮助:
只需使用元组数组即可。按你喜欢的排序。全部"built-in"。
var array = [(name: String, value: String)]()
// add elements
array.sort() { [=10=].name < .name }
// or
array.sort() { [=10=].0 < .0 }
正如 Matt 所说,字典(和集合)是 Swift(和 Objective-C)中的无序集合。这是设计使然。
如果需要,您可以创建字典键的数组并将其排序为您想要的任何顺序,然后使用它从字典中提取项目。
NSDictionary
有一个方法 allKeys 可以为您提供数组中字典的所有键。我似乎记得 Swift 字典对象有类似的东西,但我不确定。我仍在学习 Swift.
的细微差别
编辑:
对于 Swift 个词典,它是 someDictionary.keys
您可以使用类型为 Int
的键来订购它们。
var myDictionary: [Int: [String: String]]?
或
var myDictionary: [Int: (String, String)]?
我推荐第一种,因为它是一种更常见的格式(例如JSON)。
我知道我是 8 岁参加聚会的人,但您是否查看过 NSMutableOrderedSet?
https://developer.apple.com/reference/foundation/nsorderedset
You can use ordered sets as an alternative to arrays when the order of
elements is important and performance in testing whether an object is
contained in the set is a consideration—testing for membership of an
array is slower than testing for membership of a set.
"如果您需要键值对的有序集合,并且不需要 Dictionary 提供的快速键查找,请参阅 DictionaryLiteral type for an alternative." - https://developer.apple.com/reference/swift/dictionary
如果您的键确认为 Comparable,您可以从未排序的字典创建一个排序的字典,如下所示
let sortedDictionary = unsortedDictionary.sorted() { [=10=].key > .key }
var orderedDictionary = [(key:String, value:String)]()
示例:
let dict = [
"foo": 1,
"bar": 2,
"baz": 3,
"hoge": 4,
"qux": 5
]
for (offset: offset, element: (key: key, value: value)) in dict.enumerated() {
print("\(offset): '\(key)':\(value)")
}
// Prints "0: 'bar':2"
// Prints "1: 'hoge':4"
// Prints "2: 'qux':5"
// Prints "3: 'baz':3"
// Prints "4: 'foo':1"
这是我所做的,非常简单:
let array = [
["foo": "bar"],
["foo": "bar"],
["foo": "bar"],
["foo": "bar"],
["foo": "bar"],
["foo": "bar"]
]
// usage
for item in array {
let key = item.keys.first!
let value = item.values.first!
print(key, value)
}
键不是唯一的,因为这不是 Dictionary
而是 Array
,但您可以使用数组键。
正如其他人所说,没有对此类结构的内置支持。他们可能会在某个时候向标准库添加一个实现,但考虑到它相对很少能成为大多数应用程序中的最佳解决方案,所以我不会屏住呼吸。
一个替代方案是 OrderedDictionary 项目。由于它遵循 BidirectionalCollection
,您可以获得大部分与其他 Collection
类型相同的 API,而且它似乎(目前)维护得相当好。
您可以使用 KeyValuePairs
,
来自 documentation:
Use a KeyValuePairs instance when you need an ordered collection of key-value pairs and don’t require the fast key lookup that the Dictionary type provides.
let pairs: KeyValuePairs = ["john": 1,"ben": 2,"bob": 3,"hans": 4]
print(pairs.first!)
//打印(键:"john",值:1)
你可以用官方的OrderedDictionary
从原来的Swift Repo
已排序的合集目前包含:
- Ordered Dictionary (就是你要找的)
- Ordered Set
他们说它将很快合并到 Swift 中(在 WWDC21 中)
在Swift 2 中是否有任何内置 方法来创建有序地图?数组 [T]
按对象附加到它的顺序排序,但字典 [K : V]
未排序。
例如
var myArray: [String] = []
myArray.append("val1")
myArray.append("val2")
myArray.append("val3")
//will always print "val1, val2, val3"
print(myArray)
var myDictionary: [String : String] = [:]
myDictionary["key1"] = "val1"
myDictionary["key2"] = "val2"
myDictionary["key3"] = "val3"
//Will print "[key1: val1, key3: val3, key2: val2]"
//instead of "[key1: val1, key2: val2, key3: val3]"
print(myDictionary)
是否有任何内置方法可以创建有序的 key : value
地图,其排序方式与数组相同,还是我必须创建自己的 class?
我想尽可能避免创建自己的 class,因为 Swift 包含的内容很可能会更有效率。
Swift 不包含任何内置的有序字典功能,据我所知,Swift 2 也不包含
然后您将创建自己的。您可以查看这些教程以获取帮助:
只需使用元组数组即可。按你喜欢的排序。全部"built-in"。
var array = [(name: String, value: String)]()
// add elements
array.sort() { [=10=].name < .name }
// or
array.sort() { [=10=].0 < .0 }
正如 Matt 所说,字典(和集合)是 Swift(和 Objective-C)中的无序集合。这是设计使然。
如果需要,您可以创建字典键的数组并将其排序为您想要的任何顺序,然后使用它从字典中提取项目。
NSDictionary
有一个方法 allKeys 可以为您提供数组中字典的所有键。我似乎记得 Swift 字典对象有类似的东西,但我不确定。我仍在学习 Swift.
编辑:
对于 Swift 个词典,它是 someDictionary.keys
您可以使用类型为 Int
的键来订购它们。
var myDictionary: [Int: [String: String]]?
或
var myDictionary: [Int: (String, String)]?
我推荐第一种,因为它是一种更常见的格式(例如JSON)。
我知道我是 8 岁参加聚会的人,但您是否查看过 NSMutableOrderedSet?
https://developer.apple.com/reference/foundation/nsorderedset
You can use ordered sets as an alternative to arrays when the order of elements is important and performance in testing whether an object is contained in the set is a consideration—testing for membership of an array is slower than testing for membership of a set.
"如果您需要键值对的有序集合,并且不需要 Dictionary 提供的快速键查找,请参阅 DictionaryLiteral type for an alternative." - https://developer.apple.com/reference/swift/dictionary
如果您的键确认为 Comparable,您可以从未排序的字典创建一个排序的字典,如下所示
let sortedDictionary = unsortedDictionary.sorted() { [=10=].key > .key }
var orderedDictionary = [(key:String, value:String)]()
示例:
let dict = [
"foo": 1,
"bar": 2,
"baz": 3,
"hoge": 4,
"qux": 5
]
for (offset: offset, element: (key: key, value: value)) in dict.enumerated() {
print("\(offset): '\(key)':\(value)")
}
// Prints "0: 'bar':2"
// Prints "1: 'hoge':4"
// Prints "2: 'qux':5"
// Prints "3: 'baz':3"
// Prints "4: 'foo':1"
这是我所做的,非常简单:
let array = [
["foo": "bar"],
["foo": "bar"],
["foo": "bar"],
["foo": "bar"],
["foo": "bar"],
["foo": "bar"]
]
// usage
for item in array {
let key = item.keys.first!
let value = item.values.first!
print(key, value)
}
键不是唯一的,因为这不是 Dictionary
而是 Array
,但您可以使用数组键。
正如其他人所说,没有对此类结构的内置支持。他们可能会在某个时候向标准库添加一个实现,但考虑到它相对很少能成为大多数应用程序中的最佳解决方案,所以我不会屏住呼吸。
一个替代方案是 OrderedDictionary 项目。由于它遵循 BidirectionalCollection
,您可以获得大部分与其他 Collection
类型相同的 API,而且它似乎(目前)维护得相当好。
您可以使用 KeyValuePairs
,
来自 documentation:
Use a KeyValuePairs instance when you need an ordered collection of key-value pairs and don’t require the fast key lookup that the Dictionary type provides.
let pairs: KeyValuePairs = ["john": 1,"ben": 2,"bob": 3,"hans": 4]
print(pairs.first!)
//打印(键:"john",值:1)
你可以用官方的OrderedDictionary
从原来的Swift Repo
已排序的合集目前包含:
- Ordered Dictionary (就是你要找的)
- Ordered Set
他们说它将很快合并到 Swift 中(在 WWDC21 中)