当前位置: 首页 > news >正文

Java字符串(包含字母和数字)通用排序

说明:本文章是之前查到的一篇安卓版的,具体原文路径忘记了。稍微改了一点,挺符合业务使用的!

一、看代码

/*** 包含数字的字符串进行比较(按照从小到大排序)*/private static Integer compareString(String string1, String string2) {//拆分两个字符串List<String> list1 = splitString(string1);List<String> list2 = splitString(string2);//依次对比拆分出的每个值int index = 0;while (true) {//相等表示两个字符串完全相等if (index >= Math.max(list1.size(), list2.size())) {return 0;}String str1 = null;if (index < list1.size()){str1 = list1.get(index);}else{str1 =  "";}String str2 = null;if (index < list2.size()){str2 = list2.get(index);}else{str2 =  "";}//字符串相等则继续判断下一组数据if (str1.equals(str2)) {index++;continue;}//是纯数字,比较数字大小if (isNum(str1) && isNum(str2)) {if(Integer.parseInt(str1) < Integer.parseInt(str2)){return -1;}else{return 1;}}// 字符串比较大小if(str1.compareTo(str2)>0){return -1;}else{return 1;}}}
/*** 是否是纯数字*/private static Boolean isNum(String str){return Pattern.compile("\\d+").matcher(str).matches();}
/*** 拆分字符串* 输入:第5章第100节课* 返回:[第,5,章第,100,节课]*/private static List<String> splitString(String str){Matcher matcher = Pattern.compile("([^0-9]+)|(\\d+)").matcher(str);List<String> list = new ArrayList<>();while (matcher.find()) {list.add(matcher.group());}return list;}

二、看测试

List<String> strList0 = Arrays.asList(new String[]{"4","2","5","1"});Collections.sort(strList0,(o1, o2) -> compareString(o1, o2));System.out.println(Arrays.asList(strList0));// 输出:[[1, 2, 4, 5]]List<String> strList1 = Arrays.asList(new String[]{"GSM 1900","GSM 1800","GSM 850","GSM 900"});Collections.sort(strList1,(o1, o2) -> compareString(o1, o2));System.out.println(Arrays.asList(strList1));// 输出:[[GSM 850, GSM 900, GSM 1800, GSM 1900]]List<String> strList2 = Arrays.asList(new String[]{"6G","2.4G","5G"});Collections.sort(strList2,(o1, o2) -> compareString(o1, o2));System.out.println(Arrays.asList(strList2));// 输出:[[2.4G, 5G, 6G]]List<String> strList3 = Arrays.asList(new String[]{"n78","DC_12A_n2A","n8","DC_66A_n2A","DC_1A_n77A","DC_2A_n41A"});Collections.sort(strList3,(o1, o2) -> compareString(o1, o2));System.out.println(Arrays.asList(strList3));// 输出:[n8, n78, DC_1A_n77A, DC_2A_n41A, DC_12A_n2A, DC_66A_n2A]]

三、对象测试

@Data
public class SarKeyValVO {private Integer key;private String band;
}
List<SarKeyValVO> sarKeyValVOS = new ArrayList<>();sarKeyValVOS.add(new SarKeyValVO(0,"GSM 1900"));sarKeyValVOS.add(new SarKeyValVO(1,"GSM 1800"));sarKeyValVOS.add(new SarKeyValVO(2,"GSM 850"));sarKeyValVOS.add(new SarKeyValVO(3,"GSM 900"));List<SarKeyValVO> collect = sarKeyValVOS.stream().sorted((o1, o2) -> compareString(o1.getBand(), o2.getBand())).collect(Collectors.toList());System.out.println(Arrays.asList(collect));// {...GSM 850}, {...GSM 900}, {...GSM 1800}, {...GSM 1900}
http://www.lryc.cn/news/297156.html

相关文章:

  • 【Spring】springmvc如何处理接受http请求
  • 2024年安全员-B证证模拟考试题库及安全员-B证理论考试试题
  • redis过期淘汰策略、数据过期策略与持久化方式
  • Oracle Vagrant Box 扩展根文件系统
  • TDengine用户权限管理
  • 推荐一款开源的跨平台划词翻译和OCR翻译软件:Pot
  • spring boot学习第十一篇:发邮件
  • Linux中ps/kill/execl的使用
  • 【web前端开发】HTML及CSS简单页面布局练习
  • 2.7日学习打卡----初学RabbitMQ(二)
  • 【工作学习 day04】 9. uniapp 页面和组件的生命周期
  • Mysql-数据库优化-客户端连接参数
  • 【十二】【C++】vector用法的探究
  • Docker 基本介绍
  • CentOS 7 安装 install abiword
  • 开源的直播平台
  • ChatGPT 变懒最新解释!或和系统Prompt太长有关
  • 书生·浦语大模型第三课作业
  • 【Redis笔记】分布式锁及4种常见实现方法
  • SpringMVC第一天
  • 如何利用腾讯工蜂提升广告推广和用户运营效率
  • 【QT+QGIS跨平台编译】之三十二:【MiniZip+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • OLAP技术的发展及趋势简述
  • stupid_brain
  • C# BackgroundWorker的使用
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • wyh的迷宫
  • AWS云用户创建
  • 微信小程序(三十七)选项点击高亮效果
  • 通过Demo学WPF—数据绑定(二)