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

4
我网站上有一个数据库,里面有一长串带字母的数字(产品编号),例如: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

这是可能的。一种方法是使用一个字符串加权函数,该函数为数字比字母赋予更高的权重。类似于这样:

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)

谢谢,我会转发的。他正在度假 :) - Christina Glover

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时,此方法才有效。如果您有更多位数,则应考虑扩展该函数或执行其他操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接