微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

@H_404_0@我正在使用for循环来创建由dict键和值组成的字符串.
不幸的是,Swift在Mac和Linux上的行为有所不同.

@H_404_0@用于输入parameters.keys.sorted(){…}

@H_404_0@我想按字节值而不是按字母顺序对键排序,小写参数应在大写字母之后列出.

@H_404_0@因此,像“ AWT”这样的键应该位于像“ Ast”这样的键之前.

解决方法:

@H_404_0@在Apple平台上,Swift字符串比较是基于所谓的“ Unicode规范化形式D”的Unicode标量值的字典比较,请参阅
详情请参阅How String Comparison happens in SwiftWhat does it mean that string and character comparisons in Swift are not locale-sensitive?.

@H_404_0@在Linux上,排序顺序不同.那是一个已知的问题
([String] sort order varies on Darwin vs. Linux),应在Swift 4中修复.

@H_404_0@如果您只关心ASCII字符,则可能的方法
将比较字符串的UTF-8表示形式:

@H_404_0@

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"]
@H_404_0@这在Apple平台和Linux上给出了相同的结果.

@H_404_0@但是请注意,这不是Swift字符串的认排序顺序
在Apple平台上.要在Linux上复制该代码(在Swift 4中已修复),请执行以下操作
算法将起作用:

@H_404_0@

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"]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐