用数字和字母顺序对字母进行排序

时间:2013-08-01 14:00:50

标签: sorting numerical alphabetical

我的网站上有一个数据库,其中包含#(产品号)的长列表,其中包含字母(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)

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

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

2 个答案:

答案 0 :(得分:0)

有可能。一种方法是使用函数来加权字符串,这使得数字的权重远远大于字母。像这样:

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)

答案 1 :(得分:0)

如果添加以下转换函数(在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时才有效。如果您有更多数字,那么您应该考虑扩展该功能或做其他事情。