如何对 Java 中的字母数字字符串进行排序
How to sort Alphanumber String in Java
{"SAMPLE:1-1-8-SAM#1", "SAMPLE:1-1-8-SAM#13","DEMO:1-1-4-SAM#13",DEMO:1-1-4-SAM#26,DEMO:1-1-4-SAM#8}
所以,输出将是
字母顺序和数字也
DEMO:1-1-4-SAM#26
DEMO:1-1-4-SAM#13
DEMO:1-1-4-SAM#8
SAMPLE:1-1-8-SAM#1
SAMPLE:1-1-8-SAM#13
我在ArrayList中试过了。问题是,它将整个字符串作为一个字符串。但是我想对字符串以及 number.Here 我得到的输出进行排序
DEMO:1-1-4-SAM#8
DEMO:1-1-4-SAM#13
DEMO:1-1-4-SAM#26
SAMPLE:1-1-8-SAM#1
SAMPLE:1-1-8-SAM#13
您必须自己编写 Comparator 将字符串拆分为词法部分和数字部分,然后将它们与适当的运算符进行比较。
以下是 Comparator
唯一方法 compareTo
的伪代码实现,以说明我的建议:
public void compare(String s1, String s2) {
String[] e1 = split(s1);
String[] e2 = split(s2);
int n = Math.min(e1.length, e2.length);
int ret = 0;
for (int i = 0; ret == 0 && i < n; i++) {
if (isNumber(e1[i])) {
ret = compareNumerical(e1[i], e2[i]));
} else {
ret = compareLexical(e1[i], e2[i]));
}
}
return ret;
}
如果您希望对字符串进行排序并考虑所有数字,您可以结合使用正则表达式和 Java 8.
考虑如下字符串:
"SAMPLE:1-2-8-SAM#1"
这可以使用正则表达式拆分成 String[]
这样的
String s = "SAMPLE:1-2-8-SAM#1";
String[] arr = s.split("((?<=[:\-#])|(?=[:\-#]))");
System.out.println(Arrays.stream(arr).collect(Collectors.toList()));
输出将是:
[SAMPLE, :, 1, -, 2, -, 8, -, SAM, #, 1]
这意味着我们可以将索引 0 视为 String
,将索引 2、4、6 和 10 视为 Integer
s。
因此,为了使用它进行排序,可以使用以下代码:
String[] strings = {
"SAMPLE:1-2-8-SAM#1",
"SAMPLE:1-1-8-SAM#1",
"SAMPLE:1-1-8-SAM#13",
"DEMO:1-1-4-SAM#13",
"DEMO:1-1-4-SAM#26",
"DEMO:1-1-4-SAM#8"
};
final List<String> sorted = Arrays.stream(strings)
.map(str -> str.split("((?<=[:\-#])|(?=[:\-#]))"))
.sorted(Comparator
.<String[], String>comparing((arr) -> arr[0]) // String compare
.thenComparing(arr -> Integer.valueOf(arr[2])) // Integer compare
.thenComparing(arr -> Integer.valueOf(arr[4])) // Integer compare
.thenComparing(arr -> Integer.valueOf(arr[6])) // Integer compare
.thenComparing(arr -> Integer.valueOf(arr[10]))) // Integer compare
.map(l -> Arrays.stream(l).collect(Collectors.joining())) // Map it back to a String
.collect(Collectors.toList()); // Collect it to a List for further processing
它不是超级可读,但它按照 OP:s 问题工作。如果您还使用一些静态导入,代码会更容易阅读。
但是,我的建议是创建一个 Comparator
来进行排序,这将更具可读性(从而更容易在长 运行 中维护)。
{"SAMPLE:1-1-8-SAM#1", "SAMPLE:1-1-8-SAM#13","DEMO:1-1-4-SAM#13",DEMO:1-1-4-SAM#26,DEMO:1-1-4-SAM#8}
所以,输出将是 字母顺序和数字也
DEMO:1-1-4-SAM#26
DEMO:1-1-4-SAM#13
DEMO:1-1-4-SAM#8
SAMPLE:1-1-8-SAM#1
SAMPLE:1-1-8-SAM#13
我在ArrayList中试过了。问题是,它将整个字符串作为一个字符串。但是我想对字符串以及 number.Here 我得到的输出进行排序
DEMO:1-1-4-SAM#8
DEMO:1-1-4-SAM#13
DEMO:1-1-4-SAM#26
SAMPLE:1-1-8-SAM#1
SAMPLE:1-1-8-SAM#13
您必须自己编写 Comparator 将字符串拆分为词法部分和数字部分,然后将它们与适当的运算符进行比较。
以下是 Comparator
唯一方法 compareTo
的伪代码实现,以说明我的建议:
public void compare(String s1, String s2) {
String[] e1 = split(s1);
String[] e2 = split(s2);
int n = Math.min(e1.length, e2.length);
int ret = 0;
for (int i = 0; ret == 0 && i < n; i++) {
if (isNumber(e1[i])) {
ret = compareNumerical(e1[i], e2[i]));
} else {
ret = compareLexical(e1[i], e2[i]));
}
}
return ret;
}
如果您希望对字符串进行排序并考虑所有数字,您可以结合使用正则表达式和 Java 8.
考虑如下字符串:
"SAMPLE:1-2-8-SAM#1"
这可以使用正则表达式拆分成 String[]
这样的
String s = "SAMPLE:1-2-8-SAM#1";
String[] arr = s.split("((?<=[:\-#])|(?=[:\-#]))");
System.out.println(Arrays.stream(arr).collect(Collectors.toList()));
输出将是:
[SAMPLE, :, 1, -, 2, -, 8, -, SAM, #, 1]
这意味着我们可以将索引 0 视为 String
,将索引 2、4、6 和 10 视为 Integer
s。
因此,为了使用它进行排序,可以使用以下代码:
String[] strings = {
"SAMPLE:1-2-8-SAM#1",
"SAMPLE:1-1-8-SAM#1",
"SAMPLE:1-1-8-SAM#13",
"DEMO:1-1-4-SAM#13",
"DEMO:1-1-4-SAM#26",
"DEMO:1-1-4-SAM#8"
};
final List<String> sorted = Arrays.stream(strings)
.map(str -> str.split("((?<=[:\-#])|(?=[:\-#]))"))
.sorted(Comparator
.<String[], String>comparing((arr) -> arr[0]) // String compare
.thenComparing(arr -> Integer.valueOf(arr[2])) // Integer compare
.thenComparing(arr -> Integer.valueOf(arr[4])) // Integer compare
.thenComparing(arr -> Integer.valueOf(arr[6])) // Integer compare
.thenComparing(arr -> Integer.valueOf(arr[10]))) // Integer compare
.map(l -> Arrays.stream(l).collect(Collectors.joining())) // Map it back to a String
.collect(Collectors.toList()); // Collect it to a List for further processing
它不是超级可读,但它按照 OP:s 问题工作。如果您还使用一些静态导入,代码会更容易阅读。
但是,我的建议是创建一个 Comparator
来进行排序,这将更具可读性(从而更容易在长 运行 中维护)。