[英]Sorting the String Array based on given pattern in Java
我的输入字符串数组如下所示:
String[] arr = {"2T1BURHE1JCO24154C", "2TABURHE1JC024154C", "JTDKARFP5H3055472C", "2T2BURHE1JCO24154C", "JTDKARFP1H3056246C"};
输出数组应如下所示:
{"JTDKARFP1H3056246C",
"JTDKARFP5H3055472C",
"2TABURHE1JC024154C",
"2T1BURHE1JCO24154C",
"2T2BURHE1JCO24154C"}
这里的优先级在以下模式中给出:
[ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]
当我在 Java 中使用 Arrays.sort(arr) 时,它以字典模式对数组进行排序并给出以下输出:
[2T1BURHE1JCO24154C、2T2BURHE1JCO24154C、2TABURHE1JC024154C、JTDKARFP1H3056246C、JTDKARFP5H3055472C]
我怎么能在 Java 中实现这一点。
谢谢。
您需要自定义一个比较器,您可以通过按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
看起来像约翰斯作品我觉得这更干净一点。
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 操作不是最好的。 更好的解决方案是改变标准的 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;
};
大多数功能是相同的。 但相反,我们确定我们是将字母与字母或数字与数字进行比较,以进行正常比较。 否则反向将字母放在数字之前。
*最终编辑。 不要制作字符数组,只是从字符串中获取字符。
在 100 万个项目上,从旧方法到新方法的比较要快 2 倍以上。 800 毫秒对比 1800 毫秒
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.