`
oywl2008
  • 浏览: 1051956 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

中文、英文和中英文混合排序

 
阅读更多

对Search进行排序

SearchComparator.java中的实现方法compare已不能满足需要

其中涉及到中文、英文或者中英文混合排序,所以,这里使用开源的Pingyin 对起排序

SearchComparator.java调用sortListByType排序,其中调用了PinyinComparator

SearchComparator .java

 

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.clx.webmail.util.PinyinComparator;

 

public class SearchComparator implements Comparator<Search> {

 

 /**简单,不能用来对纯中文、纯英文或者中英文混合进行排序**/
 public int compare(Search s1, Search s2) {
  return s1.getSearchName().compareToIgnoreCase(s2.getSearchName());
 } 
 
 public List<Search> sortListByType(List<Search> list)
 {


  List engList=new ArrayList();
  List chaList=new ArrayList();


  if(list!=null&&list.size()>0)
  {


    for(int i=0;i<list.size();i++)
    {


       Search search=(Search)list.get(i);
       String name=search.getSearchName();
       /**
          *  如果英文优先,则这里的IF条件为:
          *  isContainsHanyu(name.substring(0,1))&&isContainsHanyu(name)
         **/
      if(isContainsHanyu(name))
      {
           chaList.add(search);
      }
      else
      {
           engList.add(search);
      }


    }


  }


  if(chaList.size()>0)
  {
       PinyinComparator pinyin=new PinyinComparator();
       Collections.sort(chaList,pinyin);
  }


  if(engList.size()>0)
  {
      Collections.sort(engList,this);
  }


  list=new ArrayList();
  list=copy(list,engList);
  list=copy(list,chaList);


  return list;
 }
 
 //把一个集合中的元素复制到另一个集合中
 public List copy(List sourceList,List copyList)
 {
    if(copyList!=null)
   {
      for(int i=0;i<copyList.size();i++)
      {
          sourceList.add(copyList.get(i));
      }
   }
   return sourceList;
 }
   
 
 //检查字符串是否包含中文
 public boolean isContainsHanyu(String str)
 {
        boolean flag=false;
        Pattern  pattern   =   Pattern.compile("[//u4E00-//u9FA5]+",Pattern.CANON_EQ);  
        Matcher  matcher   =   pattern.matcher(str);  


       if(matcher.find())  
       {  
            flag=true;
       }  

 
     return flag;
  
 }
 
 
     public static void main(String[] args)
    {
       String s = "test测试";
       SearchComparator comparator=new SearchComparator();
       comparator.isContainsHanyu(s);
   }

 

 

}

 

 

 

PinyinComparator.java

 

 

import java.util.Arrays;
import java.util.Comparator;

import com.clx.webmail.models.Search;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

public class PinyinComparator implements Comparator<Search>{
 
 public int compare(Search s1,Search s2) {


  String o1=s1.getSearchName();


  String o2=s2.getSearchName();


  for (int i = 0; i < o1.length() && i < o2.length(); i++) {

 

            int codePoint1 = o1.charAt(i);


            int codePoint2 = o2.charAt(i);

 

            if (Character.isSupplementaryCodePoint(codePoint1)|| Character.isSupplementaryCodePoint(codePoint2)) {
                i++;
            }

 

            if (codePoint1 != codePoint2)
            {
                if (Character.isSupplementaryCodePoint(codePoint1)|| Character.isSupplementaryCodePoint(codePoint2))

                {
                    return codePoint1 - codePoint2;
                }

                String pinyin1 = pinyin((char) codePoint1);
                String pinyin2 = pinyin((char) codePoint2);

                if (pinyin1 != null && pinyin2 != null)
                {
                 // 两个字符都是汉字
                    if (!pinyin1.equals(pinyin2))
                    {
                        return pinyin1.compareTo(pinyin2);
                    }
                }
                else
                {
                    return codePoint1 - codePoint2;
                }
            }
     }
        
     return  o1.length() -  o2.length();


}

 /**对中英文排序**/
    private String pinyin(char c) {
     
     if(String.valueOf(c)==null||String.valueOf(c).length()==0)
     {
      return "";
     }
     
     HanyuPinyinOutputFormat format = new  HanyuPinyinOutputFormat();
     format.setCaseType(HanyuPinyinCaseType.LOWERCASE);   
     format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);    
     format.setVCharType(HanyuPinyinVCharType.WITH_V);
     String output="";
     try
     {            
       if (java.lang.Character.toString(c).matches("[//u4E00-//u9FA5]+"))
       {                  
        String[] temp = PinyinHelper.toHanyuPinyinStringArray(c,format);
        if(temp!=null&&temp.length>0)
        {
         output += temp[0];
        }
       }
       else
       {
        output += java.lang.Character.toString(c);
       }
     }catch(BadHanyuPinyinOutputFormatCombination e)
     {
      e.printStackTrace();
     }
     
     return output;     
    }   
  
}

 

此外,增加一个类,此类用来得到汉语拼音,可能在排序中也用得到

 

 

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

import java.io.UnsupportedEncodingException;

/**
* 拼音工具
*
* @author zhouhang 2010-01-25

*/
public class PinyinToolkit {

        /**
         * 获取汉字串拼音首字母,英文字符不变
         *
         * @param chinese 汉字串
         * @return 汉语拼音首字母
         */
        public static String cn2FirstSpell(String chinese) {
                StringBuffer pybf = new StringBuffer();
                char[] arr = chinese.toCharArray();
                HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
                defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
                defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
                defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
                for (int i = 0; i < arr.length; i++) {
                    if (arr[i] > 128)
                    {
                        try {
                                String[] _t = PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat);
                                if (_t != null) {
                                      pybf.append(_t[0].charAt(0));
                                }
                        } catch (BadHanyuPinyinOutputFormatCombination e) {
                                e.printStackTrace();
                        }
                    } else {
                            pybf.append(arr[i]);
                    }
                }
                return pybf.toString().replaceAll("//W", "").trim();
        }

        /**
         * 获取汉字串拼音,英文字符不变
         *
         * @param chinese 汉字串
         * @return 汉语拼音
         */
        public static String cn2Spell(String chinese) {
                StringBuffer pybf = new StringBuffer();
                char[] arr = chinese.toCharArray();
                HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
                defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
                defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
                defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
                for (int i = 0; i < arr.length; i++) {
                    if (arr[i] > 128) {
                        try {
                                pybf.append(PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat)[0]);
                        } catch (BadHanyuPinyinOutputFormatCombination e) {
                                e.printStackTrace();
                        }
                    } else {
                            pybf.append(arr[i]);
                    }
                }
                return pybf.toString();
        }

        public static void main(String[] args) throws UnsupportedEncodingException {
                String x = "嘅囧誰說壞學生來勼髮視頻裆児";
                System.out.println(cn2FirstSpell(x));
                System.out.println(cn2Spell(x));
        }
}

 

 

转自: http://blog.csdn.net/shenzhen_mydream/article/details/5253048

 

 

 

 

 

分享到:
评论

相关推荐

    关于中文英文混合排序javaDemo

    总结一下,处理中文英文混合排序的关键在于理解Java的`Collator`类和`Locale`,并根据具体需求调整排序规则。这个"关于中文英文混合排序javaDemo"应该包含了一个简单的示例,演示了如何使用这些工具进行有效排序。在...

    Android 中英文混合排序

    总的来说,Android中英文混合排序需要结合自定义Comparator和中文转拼音的库来实现。这个过程涉及到了Java的排序机制、字符串处理、以及对第三方库的使用,是Android开发中一个具有挑战性但实用的问题。

    js实现中英文混合排序

    js实现中英文混合排序,支持所有浏览器,包括谷歌

    swift-通讯录最简单的中英文混合排序封装微信通讯录demo

    这个"swift-通讯录最简单的中英文混合排序封装微信通讯录demo"项目,就是一个很好的示例,它展示了如何在iOS应用中实现中英文混合的通讯录排序功能。这个项目基于Swift开发,主要涉及UI相关控件的使用,如...

    Java编程实现中英混合字符串数组按首字母排序的方法

    本文实例讲述了Java编程实现中英混合字符串数组按首字母排序的方法。分享给大家供大家参考,具体如下: 在Java中对于字符串数组的排序,我们可以使用Arrays.sort(String[])方法很便捷的进行排序。例如: String[]...

    Android实现列表数据按名称排序、中英文混合排序

    本文详细介绍了 Android 实现列表数据按名称排序和中英文混合排序的方法,包括使用 Collections.sort() 方法和自定义比较器实现排序。 Android 列表数据排序 在 Android 中,列表数据排序可以使用 Java 的 ...

    基于JS实现数字+字母+中文的混合排序方法

    ### 实现数字、英文和中文的混合排序 为了实现数字、字母和中文字符的混合排序,我们需要定义几个辅助函数,这些函数可以对数组中的元素进行比较,然后根据比较结果进行排序。 1. **arrMinNum函数**:这个函数用于...

    Java 字母数字字符串 混合排序(绝对超值管用)

    List&lt;String&gt; location=new ArrayList(); 一行代码轻松搞定混合排序问题 Collections.sort(location, new SortUtils(true));

    处理中英文名称或关键词组的混合排序问题,不仅限于汉字首字母比较,而且能够实现包括词组中逐个汉子拼音首字母比较

    在处理中英文混合排序时,我们需要将汉字转换为其对应的拼音表示,然后进行比较。Flutter社区为此提供了一些库,如`flutter_pinyin`,它可以帮助我们将汉字转换为拼音。 1. **使用flutter_pinyin库** `flutter_...

    小程序中英文混合排序问题解决

    为了解决这个问题,我们可以采用自定义的方法来实现中英文混合排序。以下是一种可行的解决方案: 1. **获取中文首字母**:编写一个名为 `getCName` 的函数,该函数接收一个中文字符作为参数。如果字符是英文,直接...

    IOS根据汉字(或英文)按字母排序并按首字母分组

    在iOS开发中,经常需要对汉字或英文名称的数组进行排序和分组,以便于用户更方便地查找和浏览。这个任务通常涉及到Objective-C(OC)编程语言的使用,因此我们今天将深入探讨如何在iOS应用中实现这个功能。 首先,...

    解决vue elementUI中table里数字、字母、中文混合排序问题

    本文将详细介绍在Element UI的表格组件中实现数字、字母和中文字符混合排序的方法。 首先,我们需要理解Element UI表格组件的排序机制。通过设置`sortable`属性,表格的某一列可以启用排序功能。默认情况下,这种...

    YZX_ChineseSorting通讯录中英文排序

    然而,随着全球化的发展,我们的联系人列表中可能包含中英文混合的名字,这就对通讯录的排序提出了新的挑战。"YZX_ChineseSorting"是一个专门解决此类问题的解决方案,它不仅支持中英文混排,还具备处理多音字的能力...

    数字字母中文排序

    根据题目描述,我们需要设计一个能够处理数字、字母、中文字符混合的排序方法。 ##### 1. 排序方法的核心思想 - 首先将输入的字符串转换成字符数组。 - 然后逐个比较两个字符串的每一个字符。 - 使用`determineType...

    android ListView根据字母排序和定位----支持混合排序

    实现的功能:混合字符串处理 中英文排序 右侧悬浮栏 顶部名称提示栏 滚动悬浮提示,文件里放置了运行的效果图,实现的效果还是让人很满意的 我开发的环境是intellij idea, 导入到eclipse要注意处理一些问题,具体...

    js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME

    在JavaScript编程中,汉字排序是一个常见的需求,尤其是在处理中文与英文混合的数据时。为了实现这个功能,我们需要确保排序算法能够正确处理中文字符,并且在不同的浏览器环境下保持一致,包括Chrome、Firefox以及...

Global site tag (gtag.js) - Google Analytics