我在我的网站上有一个数据库,上面有一个很长的#(产品号)列表,所有的都包含字母(例如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)
我的开发人员说:“colorway数字永远不能按数字排序。我们需要在数据库中为所有的colorway添加另一个数字字段,然后按数字排序。现在这些数字是按字母顺序排列的。”
如何对带有字母的数字进行排序?我们希望避免添加一个数值字段-那只是额外的工作。有没有新的技术可以做到这一点?
发布于 2013-08-01 22:22:24
这是可能的。一种方法是使用一个函数来加权字符串,该函数赋予数字比字母更多的权重。如下所示:
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)发布于 2014-01-23 19:26:59
如果添加以下转换函数(在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时,此操作才有效。如果你有更多的数字,那么你应该考虑扩展函数或做一些其他的事情。
https://stackoverflow.com/questions/17996193
复制相似问题