字母数字汉字排序问题

含有数字,字母,汉字的字符串排序问题

排序后的结果:




import java.util.ArrayList;  
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();  
        }  
    
    
    } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值