ios sort Swift中的有序地圖




swift dictionary用法 (9)

有沒有 內置的 方法在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 以與數組相同的方式排序的 key : value 映射,還是我必須創建自己的類?

如果可能的話,我想避免創建自己的類,因為Swift包含的內容很可能更有效。


這就是我做的,非常簡單:

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 但您可以使用數組鍵。


使用 Dictionary.enumerated()

例:

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"

正如Matt所說,詞典(和集合)是Swift(和Objective-C)中的無序集合。 這是設計的。

如果需要,您可以創建字典鍵的數組,並將其排序為您想要的任何順序,然後使用它從字典中獲取項目。

NSDictionary 有一個方法allKeys,它為您提供數組中字典的所有鍵。 我似乎記得類似於Swift Dictionary對象的東西,但我不確定。 我還在學習Swift的細微差別。

編輯:

對於Swift Dictionaries,它是 someDictionary.keys


    var orderedDictionary = [(key:String, value:String)]()

正如其他人所說,這種結構沒有內置的支持。 他們可能會在某些時候為標準庫添加一個實現,但鑑於它在大多數應用程序中成為最佳解決方案 相對 較少,所以我不會屏住呼吸。

另一種選擇是 OrderedDictionary 項目。 由於它遵循 BidirectionalCollection 您可以獲得大部分與其他 Collection 類型一起使用的相同API,並且它似乎(目前)維護得相當好。


只需使用一組元組。 按你喜歡的方式排序。 所有“內置”。

var array = [(name: String, value: String)]()
// add elements
array.sort() { $0.name < $1.name }
// or
array.sort() { $0.0 < $1.0 }



如果您的密鑰確認為Comparable,您可以從未排序的字典創建排序字典,如下所示

let sortedDictionary = unsortedDictionary.sorted() { $0.key > $1.key }




swift2