含有数字,字母,汉字的字符串排序问题
排序后的结果:
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.vo.userManage.LdapDataForTree;
//包装器类
public class SortTest implements Comparator<Object>{
// 比较方法,相当于减法。 (return this - wrapper)
public int compare(Object o1,Object o2) {
LdapDataForTree l1 = (LdapDataForTree) o1;
LdapDataForTree l2 = (LdapDataForTree) o2;
String name1 = l1.getSortOrder();
String name2 = l2.getSortOrder();
if(null == o1){
return 1;
}
if(null == o2){
return -1;
}
// 直接相等
if(o1 == o2 ){
return 0;
}
// 特殊情形,name有一个为空的情况.
if(null == name1||"".equals(name1)){
// 都为空,认为相对
if(null == name2||"".equals(name2)){
return 0;
} else {
return -1;
}
} else if(null == name2){
return 1;
}
if(name1.equals(name2)){
return 0;
}
// 中间 1-多个数字
Pattern pattern = Pattern.compile("\\D*(\\d+)\\D*");
Matcher matcher1 = pattern.matcher(name1);
Matcher matcher2 = pattern.matcher(name2);
//System.out.println(pattern.pattern());
//
int index1_step = 0;
int index2_step = 0;
while(matcher1.find()){
String s1 = matcher1.group(1);
String s2 = "";
if(matcher2.find()){
s2 = matcher2.group(1);
if(null==s2){
s2="";
}
}
int index1 = name1.indexOf(s1, index1_step);
int index2 = name2.indexOf(s2, index2_step);
//
index1_step = index1;
index2_step = index2;
// 索引相等的情况下
if(index1 == index2){
String pre1 = name1.substring(0, index1);
String pre2 = name2.substring(0, index2);
if(pre1.equals(pre2)){
//
long num1 = Long.parseLong(s1);
long num2 = Long.parseLong(s2);
//
if(num1 == num2){
// 比较下一组
continue;
} else {
return compareNum(num1,num2);
}
} else {
break;
}
} else {
break;
}
}
// 最后的情形.
return name1.compareTo(name2);
}
public int compareNum(long num1,long num2){
String str1 = ""+num1;
String str2 = ""+num2;
int len = str1.length()<str2.length()?str1.length():str2.length();
for(int i=0;i<len;i++){
if(str1.charAt(i)==str2.charAt(i)){
if(i==len-1){
if(str1.length()==str2.length()){
return 0;
}
if(str1.length()<str2.length()){
return -1;
}
if(str1.length()>str2.length()){
return 1;
}
}
continue;
}else if(str1.charAt(i)<str2.charAt(i)){
return -1;
}else{
return 1;
}
}
return 1;
}
public static void testNew(){
List<LdapDataForTree> chinesesOrderList = new ArrayList< LdapDataForTree>();
LdapDataForTree a = new LdapDataForTree();
LdapDataForTree a1 = new LdapDataForTree();
LdapDataForTree a2 = new LdapDataForTree();
LdapDataForTree a3 = new LdapDataForTree();
LdapDataForTree a4 = new LdapDataForTree();
LdapDataForTree a5 = new LdapDataForTree();
LdapDataForTree a6 = new LdapDataForTree();
LdapDataForTree a7 = new LdapDataForTree();
LdapDataForTree a8 = new LdapDataForTree();
LdapDataForTree a9 = new LdapDataForTree();
LdapDataForTree a0 = new LdapDataForTree();
a.setSortOrder("1");
a0.setSortOrder("13000");
a1.setSortOrder("13009 ");
a2.setSortOrder("2");
a3.setSortOrder("2aa ");
a4.setSortOrder(" ");
a5.setSortOrder("4");
a6.setSortOrder("ca测试部门2");
a7.setSortOrder("测试部门");
a8.setSortOrder("xieyangcatest");
a9.setSortOrder("1234123442");
chinesesOrderList.add(a);
chinesesOrderList.add(a0);
chinesesOrderList.add(a1);
chinesesOrderList.add(a2);
chinesesOrderList.add(a3);
chinesesOrderList.add(a4);
chinesesOrderList.add(a5);
chinesesOrderList.add(a6);
chinesesOrderList.add(a7);
chinesesOrderList.add(a8);
chinesesOrderList.add(a9);
//Collator collatorChinese = Collator.getInstance(java.util.Locale.CHINA);
//collatorChinese = Collator.getInstance(java.util.Locale.CHINESE);
// Collections.sort(chinesesOrderList, collatorChinese);
Collections.sort(chinesesOrderList,new SortTest());
System.out.println("中文+数字排序+字母: = ");
for (int i = 0; i < chinesesOrderList.size(); i++) {
LdapDataForTree chinese = chinesesOrderList.get(i);
System.out.println("" + chinese.getSortOrder());
}
}
public static void main(String[] args) {
testNew();
}
}