java - Java 对字符串数组进行排序(与数字和字符混合)
问题描述
我正在用 Java 对数组进行排序,我的输入是 {"a3"、"a2"、"a11"、"b1"、"b2"、"b3"、"c3"、"c13"、"c2"} 和我想要输出{“a2”、“a3”、“a11”、“b1”、“b2”、“b3”、“c2”、“c3”、“c13”}
我在下面所做的没有返回正确的结果,任何建议/代码示例表示赞赏
import java.util.Arrays;
public class Main
{
public static void main(String[] args) {
String[] var = {"a3", "a2", "a11", "b1", "b2", "b3", "c3", "c13", "c2"};
Arrays.sort(var);
System.out.println(Arrays.toString(var));
}
}
从上面的代码我得到输出 [a11, a2, a3, b1, b2, b3, c13, c2, c3]
解决方案
这是一个相对简单的方法。但是,对于这样的事情,我会创建一个类来分别保存字母和数字部分并编写一个比较器。当我打印对象时,我只需toString()
返回原始值。
这是基本的。它不检查格式错误的字符串。
String[] var = {"a3", "a2", "a11", "b1", "b2", "b3", "c3", "c13", "c2"};
Comparator<String> comp = (a,b)->{
// split the strings between the last char and the first digit
String[] v1 = a.split("(?<!\\d)(?=\\d)");
String[] v2 = b.split("(?<!\\d)(?=\\d)");
// convert each integer part to an int.
int n1 = Integer.valueOf(v1[1]);
int n2 = Integer.valueOf(v2[1]);
// compare each and get the result
int r1 = v1[0].compareTo(v2[0]);
int r2 = Integer.compare(n1,n2);
// first sort on r1 (the strings). If they are equal ( r1 == 0)
// then sort on the result of comparing the integers.
return r1 == 0 ? r2 : r1;
};
Array.sort 不采用比较器,因此您需要将数组转换为列表并对其进行排序。这也将更改数组,因为对象数组备份从Arrays.asList
.
Collections.sort(Arrays.asList(var),comp);
System.out.println(Arrays.toString(var));
印刷
[a2, a3, a11, b1, b2, b3, c2, c3, c13]
推荐阅读
- c# - 如何解决 AssetBundle 上的错误“找不到类型或命名空间名称”
- c - 删除和插入一个节点链表 C
- python - discord.py 如何获取具有特定角色的成员列表?
- javascript - 决定谁是井字游戏的赢家?(更多下文)
- ios - Swift、iOS 14:在哪里可以找到设备日志?
- linux - 如何使用 systemd 服务和 Golang 注意到 wtmp 文件的变化?
- arrays - C:在动态分配的字符数组中打印最长的字符串
- graphql - Gatsby graphiQL - 不能为不可为空的字段 ImageSharpFluid.src 返回 null
- javascript - asp-for 选择标签中的值列表 [在 JS 中]
- react-native - 当我将带有 TextInput 的视图提取到函数时,为什么我的键盘在每次击键时都会被解除,但当我直接返回时却不会?