【问题标题】:How to sort an array of Strings based on the parsed first digit如何根据解析的第一个数字对字符串数组进行排序
【发布时间】:2025-12-03 10:15:01
【问题描述】:

我刚刚完成了一场编码比赛,其中一个问题要求我对字符串数组进行排序,但数字是基于字符串中第一个出现的数字。例如:

String[] array = 
{{"18.sdfahsdfkjadf"},
 {"1.skjfhadksfhad"},
 {"2.asldfalsdf"}};

需要先排序为 1.sk...,然后是 2.as...,最后是 18.sd...。但是,如果您使用(在 Java 中)Arrays.sort(array),它将被排序为 1、18,然后是 2,因为它首先从第一个字符开始,而不是作为数字。

【问题讨论】:

  • 基本上就像this.
  • 或者喜欢thislol

标签: java arrays string sorting


【解决方案1】:

您可以拆分\D(表示非数字)上的每个字符串,并根据结果数组的第一个元素(解析为整数)比较字符串。

演示:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        String[] array = { "18.sdfahsdfkjadf", "1.skjfhadksfhad", "2.asldfalsdf" };
        
        Arrays.sort(array, 
                        (s1, s2) -> 
                            Integer.compare(
                                                Integer.parseInt(s1.split("\\D")[0]),
                                                Integer.parseInt(s2.split("\\D")[0])
                                            )
                    );

        System.out.println(Arrays.toString(array));
    }
}

输出:

[1.skjfhadksfhad, 2.asldfalsdf, 18.sdfahsdfkjadf]

【讨论】:

  • 所以当我使用 \\D 正则表达式模式拆分时,它会创建一个数组,例如 {18, sdfahsdfkjadf} ?
【解决方案2】:

使用Streams API,您可以生成类似这样的内容(假设数字总是通过标点符号与其他数字分开):

List<String> sorted = Arrays.stream(array).sorted((s1, s2) -> {
         Integer i = Integer.parseInt(s1.split("\\.")[0]);
         Integer j = Integer.parseInt(s2.split("\\.")[0]);
         return i.compareTo(j);
}).collect(Collectors.toList());

结果数组为: [1.skjfhadksfhad, 2.asldfalsdf, 18.sdfahsdfkjadf]

【讨论】:

    【解决方案3】:

    试试这个。

    Arrays.sort(array, Comparator.comparingInt(s -> Integer.parseInt(s.split("\\.")[0])));
    System.out.println(Arrays.toString(array));
    

    输出:

    [1.skjfhadksfhad, 2.asldfalsdf, 18.sdfahsdfkjadf]
    

    【讨论】: