如何对 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 视为 Integers。

因此,为了使用它进行排序,可以使用以下代码:

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 来进行排序,这将更具可读性(从而更容易在长 运行 中维护)。