基于Java中的给定模式对字符串数组进行排序
Posted
技术标签:
【中文标题】基于Java中的给定模式对字符串数组进行排序【英文标题】:Sorting the String Array based on given pattern in Java 【发布时间】:2018-11-29 19:29:00 【问题描述】:我的输入字符串数组如下:
字符串[] arr = "2T1BURHE1JCO24154C", “2TABURHE1JC024154C”, “JTDKARFP5H3055472C”, “2T2BURHE1JCO24154C”, "JTDKARFP1H3056246C";
输出数组应如下:
"JTDKARFP1H3056246C",
"JTDKARFP5H3055472C",
"2TABURHE1JC024154C",
"2T1BURHE1JCO24154C",
"2T2BURHE1JCO24154C"
这里的优先级在下面的模式中给出:
[ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]
当我在 Java 中使用 Arrays.sort(arr) 时,它会以字典模式对数组进行排序并给出以下输出:
[2T1BURHE1JCO24154C、2T2BURHE1JCO24154C、2TABURHE1JC024154C、JTDKARFP1H3056246C、JTDKARFP5H3055472C]
我如何在 Java 中实现这一点。
谢谢。
【问题讨论】:
您可以尝试创建一个自定义比较器来比较字母在“优先级数组”中的位置。这个问题虽然很广泛。 String 将始终根据其 compareTo() 方法中的顺序排序()。如果需要自定义排序,则需要为排序方法提供自己的自定义 Comparator。 Arrays.sort(arr, Collections.reverseOrder());是不是很简单? RadixSort 你必须使用 【参考方案1】:您需要自定义一个比较器,您可以通过比较字符在order
中的位置来实现:
public static void main(String[] args)
String[] arr = "2T1BURHE1JCO24154C",
"2TABURHE1JC024154C",
"JTDKARFP5H3055472C",
"2T2BURHE1JCO24154C",
"JTDKARFP1H3056246C";
String order = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Arrays.sort(arr, (first, second) ->
for (int index = 0; index < second.length(); index++)
int charFirst = (int) (first.charAt(index));
int charSecond = (int) (second.charAt(index));
if (order.indexOf(charFirst) > order.indexOf(charSecond))
return 1;
else if (order.indexOf(charFirst) < order.indexOf(charSecond))
return -1;
else
continue;
return 0;
);
for (String s : arr)
System.out.println(s);
输出:
JTDKARFP1H3056246C
JTDKARFP5H3055472C
2TABURHE1JC024154C
2T1BURHE1JCO24154C
2T2BURHE1JCO24154C
【讨论】:
【参考方案2】:看起来像约翰斯的作品,我认为这更干净一些。
String order = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Comparator<String> c = (s1, s2) ->
int minLen = Math.min(s1.length(), s2.length());
for (int i = 0; i < minLen; i++)
char s1Char = s1.charAt(i);
char s2Char = s2.charAt(i);
if (s1Char == s2Char)
//if characters are the same skip
continue;
else
//if the characters are diff get precedence
return order.indexOf(s1Char) - order.indexOf(s2Char);
// if all chars are the same the longer one is last
return s1.length() - s2.length();
;
虽然上面的作品我认为 indexOf op 不是最好的。更好的解决方案是改变标准的 compareTo 函数:
Comparator<String> c = (s1, s2) ->
int len1 = s1.length();
int len2 = s2.length();
int lim = Math.min(len1, len2);
int k = 0;
while (k < lim)
char c1 = s1.charAt(k);
char c2 = s2.charAt(k);
if (c1 != c2)
if ((c1 >= 'A' && c2 >= 'A') ^ (c1 <= '9' && c2 <= '9'))
return c1 - c2;
else return c2 - c1;
k++;
return len1 - len2;
;
大部分功能是相同的。但相反,我们确定我们是在比较字母与字母还是数字与数字进行正常比较。 else reverse 将字母放在数字之前。
*最终编辑。不要让字符数组只从字符串中获取字符。
在 100 万件商品上,旧方法与新方法的比较快了 2 倍以上。 800ms 对比 1800ms
【讨论】:
这个更好 可能还想将字符串大写以防万一。以上是关于基于Java中的给定模式对字符串数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章
java 给定一个字符串数组。按照字典顺序进行从小到大的排序。