4

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

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

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

4

2 回答 2

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

于 2014-01-23T11:26:58.643 回答
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)
于 2013-08-01T14:22:23.717 回答