gpt4 book ai didi

Swift 如何按字节值而不是按字母顺序对字典键进行排序?

转载 作者:搜寻专家 更新时间:2023-11-01 06:33:55 26 4
gpt4 key购买 nike

我正在使用 for 循环来创建字典键和值的字符串。不幸的是,swift 在 Mac 和 Linux 上的行为不同。

for key in parameters.keys.sorted() {...}

我想按字节值而不是字母顺序对我的键进行排序,小写参数应列在大写参数之后。

因此像“AWT”这样的键应该出现在像“Ast”这样的键之前。

最佳答案

在 Apple 平台上,Swift 字符串比较是 Unicode 标量值的字典顺序比较,基于所谓的“Unicode Normalization Form D”,参见 How String Comparison happens in SwiftWhat does it mean that string and character comparisons in Swift are not locale-sensitive?了解详情。

在 Linux 上,排序顺序不同。这是一个已知问题( [String] sort order varies on Darwin vs. Linux ) 并且应该在 Swift 4 中得到修复。

如果您只关心 ASCII 字符,那么一种可能的方法是比较字符串的 UTF-8 表示:

func utf8StringCompare(s1: String, s2: String) -> Bool {
let u1 = s1.utf8
let u2 = s2.utf8
for (x, y) in zip(u1, u2) {
if x < y { return true }
if x > y { return false }
}
return u1.count < u2.count
}


let s = ["AWT", "Ast"].sorted(by: utf8StringCompare)
print(s) // ["AWT", "Ast"]

这在 Apple 平台和 Linux 上给出了相同的结果。

但请注意,这不是 Swift 字符串的默认排序顺序在苹果平台上。要在 Linux 上复制它(在 Swift 4 中修复之前),请执行以下操作算法会起作用:

func unicodeStringCompare(s1: String, s2: String) -> Bool {
let u1 = s1.decomposedStringWithCanonicalMapping.unicodeScalars
let u2 = s2.decomposedStringWithCanonicalMapping.unicodeScalars
for (x, y) in zip(u1, u2) {
if x.value < y.value { return true }
if x.value > y.value { return false }
}
return u1.count < u2.count
}

let someStrings = ["a", "b", "e", "f", "ä", "é"].sorted(by: unicodeStringCompare)
print(someStrings) // ["a", "ä", "b", "e", "é", "f"]

关于Swift 如何按字节值而不是按字母顺序对字典键进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43921538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com