【问题标题】:Sort numbers with letters numerically and alphabetically按数字和字母顺序对带有字母的数字进行排序
【发布时间】:2013-08-02 12:03:12
【问题描述】:

我的网站上有一个数据库,其中包含一长串#(产品编号),所有包含字母(Exp. TC-345、TC-234 或 HC-236W 123-234-PWD...)

我们可以按数字和字母顺序对网站上的 # 进行排序吗?

目前我们按字母顺序存储,所以顺序是 (10-PDW, 100-PDW, 110-PDW 2-PDW) 我们想把它改成(2-PDW, 10-PDW, 100-PDW, 110-PDW)

我的开发人员说“颜色编号永远不能按数字排序。我们需要为所有颜色向数据库添加另一个数字字段,然后按数字排序该字段。现在这些数字按字母顺序排列。”

如何用字母对数字进行排序?我们希望避免添加数字字段——这只是额外的工作。有什么新技术可以做到这一点吗?

【问题讨论】:

    标签: sorting numerical alphabetical


    【解决方案1】:

    这是可能的。一种方法是使用一个函数来加权字符串,它赋予数字比字母更大的权重。像这样的:

    letbers = ["10-PDW", "100-PDW", "110-PDW", "2-PDW"]
    
    def weight(letber):
        if letber == "":
            return 0
        n = ord(letber[-1])
        if letber[-1] in "0123456789":
            n *= 256^6                  # 6 because maximum key length is 6
        return 256*n + weight(letber[:-1])
    
    print sorted(letbers, key = weight)
    

    【讨论】:

    • 谢谢你,我会转发这个,他正在度假:)
    【解决方案2】:

    如果添加以下转换函数(在 scala 中),则可以按字母顺序和数字顺序对所有字符串进行排序:

    def transformed(s: String): String = {
      s.replaceAll("""(?<=[^\d]|^)(\d)(?=[^\d]|$)""","""000$1""")
       .replaceAll("""(?<=[^\d]|^)(\d\d)(?=[^\d]|$)""","""00$1""")
       .replaceAll("""(?<=[^\d]|^)(\d\d\d)(?=[^\d]|$)""","""0$1""")
    }
    

    基本上它用一个固定宽度的整数替换每个出现的数字,因此在这种情况下,字母排序等于数字排序。

    测试您的输入:

    > val s = List("10-PDW", "100-PDW", "110-PDW", "2-PDW")
    
    > s.sortBy(transformed)
    
    res2: List[String] = List(2-PDW, 10-PDW, 100-PDW, 110-PDW)
    

    这只有在你确定所有数字都低于 9999 时才有效。如果你有更多的数字,那么你应该考虑扩展功能或做其他事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多