* 类名称:NaturalOrderComparator   
* 类描述:   用于带数字字母的字符串混合排序
* 例子:↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
* 排序前:V1FJX_6,V1FJX_12_8_3_1,V1FJX_12_8_3,V1FJX_12_8,V1FJX_12,V1FJX_12_2,V1FJX_4,V1FJX_12_4,V1FJX_2,V1FJX_12_6
* 排序后:V1FJX_2,V1FJX_4,V1FJX_6,V1FJX_12,V1FJX_12_2,V1FJX_12_4,V1FJX_12_6,V1FJX_12_8,V1FJX_12_8_3,V1FJX_12_8_3_1
* 例子:↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

import java.util.*;/**
*
* 类名称:NaturalOrderComparator
* 类描述:   用于带数字字母的字符串混合排序
* 例子:↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
* 排序前:V1FJX_6,V1FJX_12_8_3_1,V1FJX_12_8_3,V1FJX_12_8,V1FJX_12,V1FJX_12_2,V1FJX_4,V1FJX_12_4,V1FJX_2,V1FJX_12_6
* 排序后:V1FJX_2,V1FJX_4,V1FJX_6,V1FJX_12,V1FJX_12_2,V1FJX_12_4,V1FJX_12_6,V1FJX_12_8,V1FJX_12_8_3,V1FJX_12_8_3_1
* 例子:↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
* 创建时间:2020年10月10日 下午5:38:38
* @version
*/public class NaturalOrderComparator implements Comparator {int compareRight(String a, String b) {int bias = 0, ia = 0, ib = 0;// The longest run of digits wins. That aside, the greatest// value wins, but we can't know that it will until we've scanned// both numbers to know that they have the same magnitude, so we// remember it in BIAS.for (; ; ia++, ib++) {char ca = charAt(a, ia);char cb = charAt(b, ib);if (!isDigit(ca) && !isDigit(cb)) {return bias;}if (!isDigit(ca)) {return -1;}if (!isDigit(cb)) {return +1;}if (ca == 0 && cb == 0) {return bias;}if (bias == 0) {if (ca < cb) {bias = -1;} else if (ca > cb) {bias = +1;}}}}@Overridepublic int compare(Object o1, Object o2) {String a = o1.toString();String b = o2.toString();int ia = 0, ib = 0;int nza = 0, nzb = 0;char ca, cb;while (true) {// Only count the number of zeroes leading the last number comparednza = nzb = 0;ca = charAt(a, ia);cb = charAt(b, ib);// skip over leading spaces or zeroswhile (Character.isSpaceChar(ca) || ca == '0') {if (ca == '0') {nza++;} else {// Only count consecutive zeroesnza = 0;}ca = charAt(a, ++ia);}while (Character.isSpaceChar(cb) || cb == '0') {if (cb == '0') {nzb++;} else {// Only count consecutive zeroesnzb = 0;}cb = charAt(b, ++ib);}// Process run of digitsif (Character.isDigit(ca) && Character.isDigit(cb)) {int bias = compareRight(a.substring(ia), b.substring(ib));if (bias != 0) {return bias;}}if (ca == 0 && cb == 0) {// The strings compare the same. Perhaps the caller// will want to call strcmp to break the tie.return compareEqual(a, b, nza, nzb);}if (ca < cb) {return -1;}if (ca > cb) {return +1;}++ia;++ib;}}static boolean isDigit(char c) {return Character.isDigit(c) || c == '.' || c == ',';}static char charAt(String s, int i) {return i >= s.length() ? 0 : s.charAt(i);}static int compareEqual(String a, String b, int nza, int nzb) {if (nza - nzb != 0) {return nza - nzb;}if (a.length() == b.length()) {return a.compareTo(b);}return a.length() - b.length();}public static void main(String[] args) {String[] strings = new String[]{"V1FJX_6","V1FJX_12_8_3_1","V1FJX_12_8_3", "V1FJX_12_8","V1FJX_12", "V1FJX_12_2", "V1FJX_4", "V1FJX_12_4","V1FJX_2", "V1FJX_12_6"};List scrambled = Arrays.asList(strings);Collections.shuffle(scrambled);Collections.sort(scrambled, new NaturalOrderComparator());System.out.println("排序后: " + scrambled);}}

Java字符串排序-带数字字母的字符串混合排序相关推荐

  1. php 字母数字混合排序,JavaScript_基于JS实现数字+字母+中文的混合排序方法,在上篇文章给大家介绍了JavaScr - phpStudy...

    基于JS实现数字+字母+中文的混合排序方法 在上篇文章给大家介绍了JavaScript sort数组排序方法和自我实现排序方法小结,用自己的方法实现了数字数组的排序. 当然,实际运用中,我还是会使用s ...

  2. java用正则表达式判断字符串中是否仅包含英文字母、数字和汉字_灵思致远Leansmall的博客-CSDN博客_java判断字符串只包含数字字母

    import java.util.regex.Matcher; import java.util.regex.Pattern;public class StrValidate {// 纯数字priva ...

  3. java去除符号和字母_java 字符串中去除 数字 字母 符号N*1*senten.Length=M*M

    字符串中去除 数字 字母 符号 String str = "今天1@天%.气^64很?不?错.心情6666很好....."; String str1 = str.replaceAl ...

  4. java去除字母_java 字符串中去除 数字 字母 符号amp;amp;N*1*senten.Length=gt;M*M

    字符串中去除 数字 字母 符号 String str = "今天1@天%.气^64很?不?错.心情6666很好....."; String str1 = str.replaceAl ...

  5. java 提取字符串中前面的数字_Java提取字符串中的数字

    在Java中,如果输入一串由其他非数字字符隔开的数字,但却想要将其中的数字提取出来,网上已经给出多种解决方案,以下对这些方法及其对应的情况进行简单的总结,并提出自己的解决方案: 1.多个由不确定字符隔 ...

  6. java中print换行符_如何在java中打印带换行符的字符串

    我需要使用 java打印一个字符串,所以我喜欢以下解决方案经过google搜索了很多.我做了一些更改来打印字符串而不显示打印对话框.我的问题是虽然这个方法正确地打印了字符串,但它不会像我定义的那样破坏 ...

  7. Python 正则表达式+字符串分割(数字/字母/汉字/特殊字符)

    1. 基本知识 函数 说明 \u0041-\u005a 大写字母unicode范围 \u0061-\u007a 小写字母unicode范围 \u0041-\u007a 英文字母unicode范围 \u ...

  8. python判断字符串是纯数字_python判断字符串是否纯数字的方法

    本文实例讲述了python判断字符串是否纯数字的方法.分享给大家供大家参考.具体如下: 判断的代码如下,通过异常判断不能区分前面带正负号的区别,正则表达式可以根据自己需要比较灵活的写,通过isdigi ...

  9. c语言去除字符串中字母,C语言经典例题100例——C语言练习实例32解答(在字符串中删除指定字母或字符串)...

    题目:删除一个字符串中的指定字母,如:字符串 "aca",删除其中的 a 字母. 程序分析:无. 程序源代码: // 百宝箱工作室 官方网址 http://www.baibaox. ...

  10. c语言提取字符串里面的数字,一个截取字符串中数字的函数

    一个截取字符串中数字的函数 我编写了一个代码,是截取字符串中数字的函数,如输入字符串:ah123hs453sh3k后,应将字符串中的字符"123"变为整数123,"453 ...

最新文章

  1. 极客大挑战2020_五省同燃,千人开赛。2020年全国轮滑大联动暨MX名星轮滑伴我行城市轮滑挑战赛——扬州站、襄阳站、南宁站、潍坊站、沈阳站完美收官...
  2. 深入理解乐观锁与悲观锁
  3. 中关村-DIY高清之HDMI线导购
  4. python操作redis集群_python操作redis集群
  5. java演练 类与对象 给我一个数字还你一个字符串
  6. java设计模式观察者模式_java设计模式--观察者模式
  7. 计算机课程表教案,计算机专业课程表
  8. Redis基础知识 之——发布/订阅
  9. Google工程师多图详解Android架构
  10. 生鲜水果小程序微信源码完整可用精品
  11. SNOWNLP情感分析报错解决
  12. PR剪辑视频工作流程 大剪辑师分享的高级视频编辑技巧
  13. win10专业版安装.net Framework4.7.2出现问题解决办法
  14. 非计算机专业,如何学习计算机视觉
  15. node学习 express + mysql + ejs实现注册登录
  16. “爆炸图“ArcGIS中制作一张好看的爆炸分析图(附练习数据)
  17. 深入理解安卓异步任务AsyncTask
  18. 详解C语言最快关键字——register
  19. English trip EM3 LP 4B Home Design Relationship Teacher:Ryan
  20. Oracl中PL/SQL编程(10级学员 张帅鹏课堂总结)

热门文章

  1. 【爬虫实战】9应用Python网络爬虫——利用Post定向爬取下载慕课MOOC视频
  2. 常见芯片封装类型介绍
  3. 人工智能:一种现代的方法|课后习题解答
  4. 压缩/解压缩库ZipArchive
  5. Oracle 数据库 各种索引类型 简单介绍
  6. java递归 杨辉三角_java杨辉三角递归实现
  7. 工业级交换机芯片选择的注意事项
  8. 2022年11月广东软考系统集成真题及答案解析
  9. C语言学习7:ASCII码表及用法简介
  10. 路径规划-人工势场法(Artifical Potential Field)