Java.lang.Character类 复习一下

这是修正前的排序效果:

这是修正后的排序效果:

完整示例:

以下是排序的部份代码(非全部代码:拼音首字母算法不在其中)


  1. import java.util.Arrays;
  2. import java.util.Comparator;
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5. public class Demo {
  6. public static void main(String[] args) {
  7. // TODO Auto-generated method stub
  8. String fileNames[] = { "fss01", "fss2", "fss01_22", "fss3", "fss1", "fss10", "fss20", "fss4", "fss30", "fss21", "fss12","fss01_3" };
  9. char chFileNames[][] = new char[fileNames.length][];
  10. String[] oldSortedNames = new String[fileNames.length];
  11. for (int i = 0; i < fileNames.length; i++) {
  12. chFileNames[i] = fileNames[i].toCharArray();
  13. oldSortedNames[i] = fileNames[i];
  14. }
  15. // Arrays.sort(fileNames, StrLogicCmp);
  16. Arrays.sort(chFileNames, ChsLogicCmp);
  17. System.out.println("_Random_" + "\t" + "_Tradion_" + "\t" + "_Target_");
  18. String line;
  19. for (int i = 0; i < fileNames.length; i++) {
  20. line = fileNames[i] + (fileNames[i].length() >= 8 ? "\t" : "\t\t");
  21. line += oldSortedNames[i] + (oldSortedNames[i].length() >= 8 ? "\t" : "\t\t");
  22. line += new String(chFileNames[i]);
  23. System.out.println(line);
  24. }
  25. }
  26. static Comparator<String> StrLogicCmp = new Comparator<String>() {
  27. @Override
  28. public int compare(String o1, String o2) {
  29. // TODO Auto-generated method stub
  30. return 0;
  31. }
  32. };
  33. // "f01s2s22", "f1s02s2"
  34. static Comparator<char[]> ChsLogicCmp = new Comparator<char[]>() {
  35. class Int{
  36. public int i;
  37. }
  38. public int findDigitEnd(char[] arrChar, Int at) {
  39. int k = at.i;
  40. char c = arrChar[k];
  41. boolean bFirstZero = (c == '0');
  42. while (k < arrChar.length) {
  43. c = arrChar[k];
  44. //first non-digit which is a high chance.
  45. if (c > '9' || c < '0') {
  46. break;
  47. }
  48. else if (bFirstZero && c == '0') {
  49. at.i++;
  50. }
  51. k++;
  52. }
  53. return k;
  54. }
  55. @Override
  56. public int compare(char[] a, char[] b) {
  57. if(a != null || b != null){
  58. Int aNonzeroIndex = new Int();
  59. Int bNonzeroIndex = new Int();
  60. int aIndex = 0, bIndex = 0,
  61. aComparedUnitTailIndex, bComparedUnitTailIndex;
  62. //              Pattern pattern = Pattern.compile("D*(d+)D*");
  63. //              Matcher matcher1 = pattern.matcher(a);
  64. //              Matcher matcher2 = pattern.matcher(b);
  65. //              if(matcher1.find() && matcher2.find()) {
  66. //                  String s1 = matcher1.group(1);
  67. //                  String s2 = matcher2.group(1);
  68. //              }
  69. while(aIndex < a.length && bIndex < b.length){
  70. //aIndex <
  71. aNonzeroIndex.i = aIndex;
  72. bNonzeroIndex.i = bIndex;
  73. aComparedUnitTailIndex = findDigitEnd(a, aNonzeroIndex);
  74. bComparedUnitTailIndex = findDigitEnd(b, bNonzeroIndex);
  75. //compare by number
  76. if (aComparedUnitTailIndex > aIndex && bComparedUnitTailIndex > bIndex)
  77. {
  78. int aDigitIndex = aNonzeroIndex.i;
  79. int bDigitIndex = bNonzeroIndex.i;
  80. int aDigit = aComparedUnitTailIndex - aDigitIndex;
  81. int bDigit = bComparedUnitTailIndex - bDigitIndex;
  82. //compare by digit
  83. if(aDigit != bDigit)
  84. return aDigit - bDigit;
  85. //the number of their digit is same.
  86. while (aDigitIndex < aComparedUnitTailIndex){
  87. if (a[aDigitIndex] != b[bDigitIndex])
  88. return a[aDigitIndex] - b[bDigitIndex];
  89. aDigitIndex++;
  90. bDigitIndex++;
  91. }
  92. //if they are equal compared by number, compare the number of '0' when start with "0"
  93. //ps note: paNonZero and pbNonZero can be added the above loop "while", but it is changed meanwhile.
  94. //so, the following comparsion is ok.
  95. aDigit = aNonzeroIndex.i - aIndex;
  96. bDigit = bNonzeroIndex.i - bIndex;
  97. if (aDigit != bDigit)
  98. return aDigit - bDigit;
  99. aIndex = aComparedUnitTailIndex;
  100. bIndex = bComparedUnitTailIndex;
  101. }else{
  102. if (a[aIndex] != b[bIndex])
  103. return a[aIndex] - b[bIndex];
  104. aIndex++;
  105. bIndex++;
  106. }
  107. }
  108. }
  109. return a.length - b.length;
  110. }
  111. };
  112. }

 

Java Comparator字符排序(数字、字母、中文混合排序)的更多相关文章

  1. java只允许输入数字字母下划线中文

    public static void main(String[] args) { Pattern pattern = Pattern.compile("[_0-9a-z]+"); ...

  2. MySQL、Oracle、DB2等数据库常规排序、自定义排序和按中文拼音字母排序

    MySQL常规排序.自定义排序和按中文拼音字母排序,在实际的SQL编写时,我们有时候需要对条件集合进行排序. 下面给出3中比较常用的排序方式,mark一下 1.常规排序ASC DESC ASC 正序 ...

  3. JavaScript非数字(中文)排序

    直接上代码: var arr=[ {name:"张散步",age:"23",sports:"篮球",number:"231123& ...

  4. Jtable 表格按多列排序(支持中文汉字排序)

    这两天公司让做一个Jtable表格的排序,首先按A列排序,在A列相等时按B列排序,B列相等时按C列排序,ABC三列可以任意指定,最多分三列,这样的一个需求.由于我是大神,所以必须做了出来.ok,不自恋 ...

  5. Sql Server之ORDER BY不规则排序.如:中文月份排序

    ORDER BY CASE Month WHEN '一月' THEN 1 WHEN '二月' THEN 2 WHEN '三月' THEN 3 WHEN '四月' THEN 4 WHEN '五月' TH ...

  6. js 混合排序(类似中文手机操作系统中的通讯录排序)

    在阳光明媚最适合打盹的下午, 特意静音的手机竟然动起来了, 你没看错, 它震动了.... 上帝(顾客)来电, "报表查询系统左侧树状菜单中设备的中文名称不能排序", 要增加排序功能 ...

  7. mysql实现首字母从A-Z排序

    1.常规排序ASC DESC ASC 正序 DESC倒叙 -- 此处不用多讲 2.自定义排序 自定义排序是根据自己想要的特定字符串(数字)顺序进行排序.主要是使用函数 FIELD(str,str1,s ...

  8. JS排序:localeCompare() 方法实现中文排序、sort方法实现数字英文混合排序

    定义:用本地特定的顺序来比较两个字符串. 语法:stringObject.localeCompare(target) 参数:target——要以本地特定的顺序与 stringObject 进行比较的字 ...

  9. java 获取中文字符的首字母

    原理: GB2312编码中的中文是按照拼音排序的 注意: 一些生僻的字无法获得正确的首字母,原因是这些字都是后加入的. import java.io.UnsupportedEncodingExcept ...

随机推荐

  1. jquery之源码

    1.插件扩展机制 所有的Jquery代理对象的实例,都是扩展自$.fn对象的 意味着只要我们继续扩展$.fn这个对象的功能,就相当于扩展了所有的Jquery代理对象的实例的功能 代码 var $bod ...

  2. Laravel Eloquent 自定义返回字段

    返回指定字段 Book::select("price", "name")->all(); 返回关系字段关联的属性 Book::select("p ...

  3. 基于TCPCopy的仿真压测方案

    一.tcpcopy工具介绍 tcpcopy 是一个分布式在线压力测试工具,可以将线上流量拷贝到测试机器,实时的模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早发现 bug,增加上线信 ...

  4. jeecg Export导出图片到excel

    import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; impo ...

  5. ATL CAxWindow类创建问题一则

    查看一个浏览器源码实现,发现其中使用了ie的控件,但例子中没有找到任何创建ie浏览器控件的代码,经过仔细跟踪,发现CAxWindow类是可以这么使用滴.. 创建的时候第三个参数直接传入url.调用到C ...

  6. 【LOJ】#2187. 「SHOI2014」三叉神经树

    题解 可以发现每次修改的是这个点往上一条连续的链,如果我要把1改成0,需要满足这一段往上的一部分都有两个1 如果我要把0改成1,需要满足这一段往上的部分有两个0 对于每个点记录1的个数,发现我们只会把 ...

  7. MQ确认机制之事务机制----confirm串行

    一:介绍 1.说明原理 A:生产者将信道设置成confirm模式,一旦信道进到confirm模式,所有该信道上发布的消息都会被指派一个唯一的ID(从1开始). 一旦消息被投递到所有匹配的队列后,bro ...

  8. Storm中关于Topology的设计

    一:介绍Storm设计模型 1.Topology Storm对任务的抽象,其实 就是将实时数据分析任务 分解为 不同的阶段 点: 计算组件   Spout   Bolt 边: 数据流向    数据从上 ...

  9. drupal8

    创建drupal的博客教程地址 区域:主题中必须定义 content 区域:因为内容(文章列表)就在content区域 定义成区块的时候可以将试图的区块放在内容区域里面: 视图通过区块和页面来显示在页 ...

  10. CentOS root用户修改密码

    1.root用户修改密码: #passwd -------------------------------- 参考资料: 1.Centos修改root密码:http://blog.163.com/wz ...