【发布时间】:2017-01-10 21:32:25
【问题描述】:
我有一个包含字符串值的数组,我想知道对其进行排序的最佳方法,但我需要将最后一个字符视为数字。
这是一个例子: 如果我将值 IRF2BP2K10、IRF2BP2K1 和 IRF2BP2K2 作为数组中的第一个、第二个和第三个元素,我该如何对它们进行排序,以便我的数组可以排列为 {IRF2BP2K1,IRF2BP2K2,IRF2BP2K10} 而不是 {IRF2BP2K1,IRF2BP2K10,IRF2BP2K2} ?
我已经尝试了下面的基本代码,但我最终得到了第二种情况,其中 IRF2BP2K10 在 IRF2BP2K2 之前排序,因为算法只考虑字符串:
For currentitem = 1 To lastitem
For nextitem = currentitem + 1 To lastitem
If Array(currentitem) > Array(nextitem) Then
Temp = Array(currentitem)
Array(currentitem) = Array(nextitem)
Array(nextitem) = Temp
End If
Next nextitem
Next currentitem
有人问我,所以这里有更多信息:并非所有项目的数字前都以“K”结尾。
以下是示例中的一些其他值,我没有将它们写成数组,因此更易于可视化:
(this list is the result using my code)
IRF2BP2KICMVCRE1
IRF2BP2KICMVCRE10
IRF2BP2KICMVCRE2
IRF2BP2KIERT2CRE1
IRF2BP2KIERT2CRE10
IRF2BP2KIERT2CRE11
IRF2BP2KIERT2CRE2
IRF2BP2KO1
IRF2BP2KO2
this is what i was trying to get:
IRF2BP2KICMVCRE1
IRF2BP2KICMVCRE2
IRF2BP2KICMVCRE10
IRF2BP2KIERT2CRE1
IRF2BP2KIERT2CRE2
IRF2BP2KIERT2CRE10
IRF2BP2KIERT2CRE11
IRF2BP2KO1
IRF2BP2KO2
我是否需要一种算法来比较数组“currentitem”的每个字符串位置与数组“nextitem”的相同位置?并且,如果它们都相等,将长度较大的项目放在长度较小的项目之后? [这样我可以将 IRF2BP2K2 排序在 IRF2BP2K10 之前的位置,因为它们都共享相同的初始字符串“IRF2BP2K”,并且仅在最后一个字符串上有所不同(一个有“2”,另一个有“10”)]
提前致谢!
【问题讨论】:
-
最后总是只有一个数字还是两位数字?
-
否,但最大值可能在 4 位左右。我不知道您是否会建议这样做,但我不想在最后一个数字之前添加零(例如,IRF2BP2K1 必须转换为 IRF2BP2K0001)。
-
它们可以,但是因为它们在字符串的中间,所以对我来说没关系,它们可以作为字符串字符排序。问题是我想要一个算法来比较最后一个字符串,如果它们是数字,并将它们作为数字而不是“字母”排序。
-
然后考虑下面@user3598756的解决方案并稍微调整一下,即找到最后一个非数字字母并(临时)格式化固定长度的数字。