我的网站上有一个数据库,其中包含#(产品号)的长列表,其中包含字母(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)
我的开发人员说“颜色编号永远不能按数字排序。我们需要在数据库中为所有颜色添加另一个数字字段,然后按字母顺序对该字段进行排序。现在这些数字按字母顺序排列。”
如何用字母对数字进行排序?我们想避免添加数字字段 - 这只是额外的工作。有没有新技术可以做到这一点?
答案 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时才有效。如果您有更多数字,那么您应该考虑扩展该功能或做其他事情。