按键排序字典

Ale*_*mad 112 sorting dictionary swift

我想在Swift中对字典进行排序.我有一个字典,如:

"A" => Array[]
"Z" => Array[]
"D" => Array[]
Run Code Online (Sandbox Code Playgroud)

我希望它像

"A" => Array[]
"D" => Array[]
"Z" => Array[]
Run Code Online (Sandbox Code Playgroud)

等等

我在SO上尝试了很多解决方案,但没有人为我工作.我正在使用XCode6 Beta 5,并且其中一些正在给出编译器错误,而一些解决方案正在提供异常.所以任何人都可以发布字典排序的工作副本.

Ivi*_* M. 146

let dictionary = [
    "A" : [1, 2],
    "Z" : [3, 4],
    "D" : [5, 6]
]

let sortedKeys = Array(dictionary.keys).sorted(<) // ["A", "D", "Z"]
Run Code Online (Sandbox Code Playgroud)

编辑:

上述代码中的排序数组仅包含键,而必须从原始字典中检索值.但是,'Dictionary'也是'CollectionType'(键,值)对的一部分,我们可以使用全局'sorted'函数来获取包含键和值的排序数组,如下所示:

let sortedKeysAndValues = sorted(dictionary) { $0.0 < $1.0 }
println(sortedKeysAndValues) // [(A, [1, 2]), (D, [5, 6]), (Z, [3, 4])]
Run Code Online (Sandbox Code Playgroud)

EDIT2:每月更改Swift语法目前更喜欢

let sortedKeys = Array(dictionary.keys).sort(<) // ["A", "D", "Z"]
Run Code Online (Sandbox Code Playgroud)

全球sorted已被弃用.

  • Swift 3 = Array(dictionary.keys).sorted(by:<) (4认同)
  • 从Swift 4开始,你可以编写`let sortedKeys = dictionary.keys.sorted()` (4认同)
  • 你是对的.我刚刚编辑了帖子,提供了一个解决方案,用于获取按键排序的(键,值)对数组.感谢您的评论. (2认同)
  • 由于这里有很多东西被欺骗,值得一提的是,现在 swift-collections 中有 OrderedDictionary。https://github.com/apple/swift-collections/blob/main/Documentation/OrderedDictionary.md (2认同)

Dan*_*ieu 102

Swift 2.0

Ivica M答案的更新版本:

let wordDict = [
     "A" : [1, 2],
     "Z" : [3, 4],
     "D" : [5, 6]
]

let sortedDict = wordDict.sort { $0.0 < $1.0 }
print("\(sortedDict)") // 
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

wordDict.sorted(by: { $0.0 < $1.0 })
Run Code Online (Sandbox Code Playgroud)

注意:

有些人似乎对结果数组不是字典感到惊讶.字典无法排序!结果数据类型是一个排序数组,就像在@ Ivica的答案中一样.

  • 这实际上返回一个[(String,[Int])]数组而不是一个Dictionary (24认同)
  • 已实现字典未排序,因此无论如何重新创建数据类型都没有多大意义.我最终只保存了一系列排序键. (4认同)

小智 25

如果要按键排序顺序迭代键和值,则此表单非常简洁

let d = [
    "A" : [1, 2],
    "Z" : [3, 4],
    "D" : [5, 6]
]

for (k,v) in Array(d).sorted({$0.0 < $1.0}) {
    println("\(k):\(v)")
}
Run Code Online (Sandbox Code Playgroud)


Abd*_*han 16

Swift 5 中,为了按 KEYS 对字典进行排序

let sortedYourArray = YOURDICTIONARY.sorted( by: { $0.0 < $1.0 })
Run Code Online (Sandbox Code Playgroud)

为了按值对字典进行排序

let sortedYourArray = YOURDICTIONARY.sorted( by: { $0.1 < $1.1 })
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这会返回字典元素的排序数组。你可以像字典一样循环它`for (key, value) insortedDictArray { }` (6认同)

小智 13

在swift 4中,你可以更聪明地写它:

let d = [ 1 : "hello", 2 : "bye", -1 : "foo" ]
d = [Int : String](uniqueKeysWithValues: d.sorted{ $0.key < $1.key })
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的努力,但首先,“ let”不会构建代码,因此首先需要将其设为“ var”。然后,在编译成功之后,此代码将无法正常运行,并且无法对字典进行排序,因此在运行此代码之前和之后我都会得到相同的结果。也许我遗漏了一些东西,但是请详细说明或更改代码。======= var d = [1:“ hello”,2:“ bye”,-1:“ foo”] print(d)-&gt;&gt;&gt;打印[2:“ bye”,-1:“ foo“,1:” hello“] d = [Int:String](uniqueKeysWithValues:d.sorted {$ 0.key &lt;$ 1.key})print(d)-&gt;&gt;&gt; prints [2:” bye“,-1 :“ foo”,1:“ hello”] (3认同)

Els*_*mak 9

我尝试了以上所有内容,简而言之,您需要的只是

let sorted = dictionary.sorted { $0.key < $1.key }
let keysArraySorted = Array(sorted.map({ $0.key }))
let valuesArraySorted = Array(sorted.map({ $0.value }))
Run Code Online (Sandbox Code Playgroud)


Shi*_*mar 7

对于Swift 4,以下内容对我有用:

let dicNumArray = ["q":[1,2,3,4,5],"a":[2,3,4,5,5],"s":[123,123,132,43,4],"t":[00,88,66,542,321]]

let sortedDic = dicNumArray.sorted { (aDic, bDic) -> Bool in
    return aDic.key < bDic.key
}
Run Code Online (Sandbox Code Playgroud)

  • 这不会返回一个Dictionary,这将返回一个元组数组 (5认同)

Thu*_*uct 7

这是对字典本身进行排序的一种优雅的替代方法:

从 Swift 4 和 5 开始

let sortedKeys = myDict.keys.sorted()

for key in sortedKeys {
   // Ordered iteration over the dictionary
   let val = myDict[key]
}
Run Code Online (Sandbox Code Playgroud)


Kre*_*kin 6

斯威夫特 5

输入要按字母顺序按键排序的字典。

// Sort inputted dictionary with keys alphabetically.
func sortWithKeys(_ dict: [String: Any]) -> [String: Any] {
    let sorted = dict.sorted(by: { $0.key < $1.key })
    var newDict: [String: Any] = [:]
    for sortedDict in sorted {
        newDict[sortedDict.key] = sortedDict.value
    }
    return newDict
}
Run Code Online (Sandbox Code Playgroud)

dict.sorted(by: { $0.key < $1.key })由它自己返回一个元组(value, value) 而不是字典[value: value]。因此,for 循环解析元组以作为字典返回。这样,您放入字典并取回字典。

  • 当你创建一个新字典时,什么保证它会被排序? (2认同)

小智 5

斯威夫特 4 & 5

对于字符串键排序:

dictionary.keys.sorted(by: {$0.localizedStandardCompare($1) == .orderedAscending})
Run Code Online (Sandbox Code Playgroud)

例子:

var dict : [String : Any] = ["10" : Any, "2" : Any, "20" : Any, "1" : Any]

dictionary.keys.sorted() 
Run Code Online (Sandbox Code Playgroud)

["1" : Any, "10" : Any, "2" : Any, "20" : Any]

dictionary.keys.sorted(by: {$0.localizedStandardCompare($1) == .orderedAscending})
Run Code Online (Sandbox Code Playgroud)

["1" : Any, "2" : Any, "10" : Any, "20" : Any]