如何根据解析的第一个数字对字符串数组进行排序
Posted
技术标签:
【中文标题】如何根据解析的第一个数字对字符串数组进行排序【英文标题】:How to sort an array of Strings based on the parsed first digit 【发布时间】:2021-07-06 10:46:43 【问题描述】:我刚刚完成了一场编码比赛,其中一个问题要求我对字符串数组进行排序,但数字是基于字符串中第一个出现的数字。例如:
String[] array =
"18.sdfahsdfkjadf",
"1.skjfhadksfhad",
"2.asldfalsdf";
需要先排序为 1.sk...,然后是 2.as...,最后是 18.sd...。但是,如果您使用(在 Java 中)Arrays.sort(array),它将被排序为 1、18,然后是 2,因为它首先从第一个字符开始,而不是作为数字。
【问题讨论】:
基本上就像this. 或者喜欢thislol 【参考方案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]
【讨论】:
以上是关于如何根据解析的第一个数字对字符串数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 array[0] 元素对数组的 ArrayList 进行排序,该元素是以 dd/mm/yyyy 格式给出的日期?