Java Comparator字符排序(数字、字母、中文混合排序)
Java.lang.Character类 复习一下
这是修正前的排序效果:

这是修正后的排序效果:


完整示例:

以下是排序的部份代码(非全部代码:拼音首字母算法不在其中)
- import java.util.Arrays;
- import java.util.Comparator;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class Demo {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- String fileNames[] = { "fss01", "fss2", "fss01_22", "fss3", "fss1", "fss10", "fss20", "fss4", "fss30", "fss21", "fss12","fss01_3" };
- char chFileNames[][] = new char[fileNames.length][];
- String[] oldSortedNames = new String[fileNames.length];
- for (int i = 0; i < fileNames.length; i++) {
- chFileNames[i] = fileNames[i].toCharArray();
- oldSortedNames[i] = fileNames[i];
- }
- // Arrays.sort(fileNames, StrLogicCmp);
- Arrays.sort(chFileNames, ChsLogicCmp);
- System.out.println("_Random_" + "\t" + "_Tradion_" + "\t" + "_Target_");
- String line;
- for (int i = 0; i < fileNames.length; i++) {
- line = fileNames[i] + (fileNames[i].length() >= 8 ? "\t" : "\t\t");
- line += oldSortedNames[i] + (oldSortedNames[i].length() >= 8 ? "\t" : "\t\t");
- line += new String(chFileNames[i]);
- System.out.println(line);
- }
- }
- static Comparator<String> StrLogicCmp = new Comparator<String>() {
- @Override
- public int compare(String o1, String o2) {
- // TODO Auto-generated method stub
- return 0;
- }
- };
- // "f01s2s22", "f1s02s2"
- static Comparator<char[]> ChsLogicCmp = new Comparator<char[]>() {
- class Int{
- public int i;
- }
- public int findDigitEnd(char[] arrChar, Int at) {
- int k = at.i;
- char c = arrChar[k];
- boolean bFirstZero = (c == '0');
- while (k < arrChar.length) {
- c = arrChar[k];
- //first non-digit which is a high chance.
- if (c > '9' || c < '0') {
- break;
- }
- else if (bFirstZero && c == '0') {
- at.i++;
- }
- k++;
- }
- return k;
- }
- @Override
- public int compare(char[] a, char[] b) {
- if(a != null || b != null){
- Int aNonzeroIndex = new Int();
- Int bNonzeroIndex = new Int();
- int aIndex = 0, bIndex = 0,
- aComparedUnitTailIndex, bComparedUnitTailIndex;
- // Pattern pattern = Pattern.compile("D*(d+)D*");
- // Matcher matcher1 = pattern.matcher(a);
- // Matcher matcher2 = pattern.matcher(b);
- // if(matcher1.find() && matcher2.find()) {
- // String s1 = matcher1.group(1);
- // String s2 = matcher2.group(1);
- // }
- while(aIndex < a.length && bIndex < b.length){
- //aIndex <
- aNonzeroIndex.i = aIndex;
- bNonzeroIndex.i = bIndex;
- aComparedUnitTailIndex = findDigitEnd(a, aNonzeroIndex);
- bComparedUnitTailIndex = findDigitEnd(b, bNonzeroIndex);
- //compare by number
- if (aComparedUnitTailIndex > aIndex && bComparedUnitTailIndex > bIndex)
- {
- int aDigitIndex = aNonzeroIndex.i;
- int bDigitIndex = bNonzeroIndex.i;
- int aDigit = aComparedUnitTailIndex - aDigitIndex;
- int bDigit = bComparedUnitTailIndex - bDigitIndex;
- //compare by digit
- if(aDigit != bDigit)
- return aDigit - bDigit;
- //the number of their digit is same.
- while (aDigitIndex < aComparedUnitTailIndex){
- if (a[aDigitIndex] != b[bDigitIndex])
- return a[aDigitIndex] - b[bDigitIndex];
- aDigitIndex++;
- bDigitIndex++;
- }
- //if they are equal compared by number, compare the number of '0' when start with "0"
- //ps note: paNonZero and pbNonZero can be added the above loop "while", but it is changed meanwhile.
- //so, the following comparsion is ok.
- aDigit = aNonzeroIndex.i - aIndex;
- bDigit = bNonzeroIndex.i - bIndex;
- if (aDigit != bDigit)
- return aDigit - bDigit;
- aIndex = aComparedUnitTailIndex;
- bIndex = bComparedUnitTailIndex;
- }else{
- if (a[aIndex] != b[bIndex])
- return a[aIndex] - b[bIndex];
- aIndex++;
- bIndex++;
- }
- }
- }
- return a.length - b.length;
- }
- };
- }
Java Comparator字符排序(数字、字母、中文混合排序)的更多相关文章
- java只允许输入数字字母下划线中文
public static void main(String[] args) { Pattern pattern = Pattern.compile("[_0-9a-z]+"); ...
- MySQL、Oracle、DB2等数据库常规排序、自定义排序和按中文拼音字母排序
MySQL常规排序.自定义排序和按中文拼音字母排序,在实际的SQL编写时,我们有时候需要对条件集合进行排序. 下面给出3中比较常用的排序方式,mark一下 1.常规排序ASC DESC ASC 正序 ...
- JavaScript非数字(中文)排序
直接上代码: var arr=[ {name:"张散步",age:"23",sports:"篮球",number:"231123& ...
- Jtable 表格按多列排序(支持中文汉字排序)
这两天公司让做一个Jtable表格的排序,首先按A列排序,在A列相等时按B列排序,B列相等时按C列排序,ABC三列可以任意指定,最多分三列,这样的一个需求.由于我是大神,所以必须做了出来.ok,不自恋 ...
- Sql Server之ORDER BY不规则排序.如:中文月份排序
ORDER BY CASE Month WHEN '一月' THEN 1 WHEN '二月' THEN 2 WHEN '三月' THEN 3 WHEN '四月' THEN 4 WHEN '五月' TH ...
- js 混合排序(类似中文手机操作系统中的通讯录排序)
在阳光明媚最适合打盹的下午, 特意静音的手机竟然动起来了, 你没看错, 它震动了.... 上帝(顾客)来电, "报表查询系统左侧树状菜单中设备的中文名称不能排序", 要增加排序功能 ...
- mysql实现首字母从A-Z排序
1.常规排序ASC DESC ASC 正序 DESC倒叙 -- 此处不用多讲 2.自定义排序 自定义排序是根据自己想要的特定字符串(数字)顺序进行排序.主要是使用函数 FIELD(str,str1,s ...
- JS排序:localeCompare() 方法实现中文排序、sort方法实现数字英文混合排序
定义:用本地特定的顺序来比较两个字符串. 语法:stringObject.localeCompare(target) 参数:target——要以本地特定的顺序与 stringObject 进行比较的字 ...
- java 获取中文字符的首字母
原理: GB2312编码中的中文是按照拼音排序的 注意: 一些生僻的字无法获得正确的首字母,原因是这些字都是后加入的. import java.io.UnsupportedEncodingExcept ...
随机推荐
- 【功能】返回数据类型、字节长度和在内部的存储位置.DUMP(w[,x[,y[,z]]])
DUMP(w[,x[,y[,z]]]) [功能]返回数据类型.字节长度和在内部的存储位置. [参数] w为各种类型的字符串(如字符型.数值型.日期型--) x为返回位置用什么方式表达,可为:8,10, ...
- vue构建项目全过程
1.node版本请更新到6.9.X版本以上,不然npm依赖会出问题 2.命令行里运行npm install --global vue-cli 3.npm install --global webpac ...
- 视觉显著性检测(Visual saliency detection)相关概念
视觉显著性检测(Visual saliency detection)指通过智能算法模拟人的视觉特点,提取图像中的显著区域(即人类感兴趣的区域). 视觉注意机制(Visual Attention Mec ...
- PHP数组序列化和反序列化
PHP序列化在我们实际项目运行过程中是一种非常常见的操作.比如当我们想要将数组值存储到数据库时,就可以对数组进行序列化操作,然后将序列化后的值存储到数据库中.其实PHP序列化数组就是将复杂的数组数据类 ...
- Linux下搭建ruby on rails环境
要搭建的东西:Ruby 1.8.7,Rails 2.3.8,rubygem 1.3.7 1.安装ruby sudo apt-get install ruby-full 2.安装rubygem sudo ...
- JavaScript实现抽象类与虚方法(六)
一:什么是js抽象类与虚方法 虚函数是类成员中的概念,是只做了一个声明而未实现的方法,具有虚函数的类就称之为抽象类,这些虚函数在派生类中才被实现.抽象类是不能实例化的,因为其中的虚函数并不是一个完整的 ...
- [转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)
假如你是一个 JavaScript 开发者,你可能见到过 Array.prototype.slice.apply(arguments) 这样的用法,然后你会问,这么写是什么意思呢? 这个语法其实不难理 ...
- thinkphp验证码的使用
thinkphp不仅封装了验证规则 还封装了验证码 文件的位置是ThinkPHP\Library\Think\Verify.class.php 下面简单的说一下如何使用 我们现在控制器里新建一个方法 ...
- Linux下编写互相通信的驱动模块并将其加入到内核中
以Mini2440为例,其Linux内核目录为/opt/FriendlyARM/mini2440/linux-2.6.32.2,在linux-2.6.32.2(Linux内核目录)下的drivers目 ...
- tomcat启动慢解决方案
一.环境 centos6.7 tomcat8 jdk1.8 二.现象 启动tomcat会花费10多分钟,正常情况下几秒就可以了. 三.解决办法 度娘了一下是因为jdk在生成随机数上耗时,找到j ...