ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Oracle的nlssort函数

Oracle的nlssort函数 nlssort函数的作用是对字段排序字符串类型的1.按拼音排序select * from MEMBER t order by NLSSORT(t.b,NLS_SORT SCHINESE_PINYIN_M)2.按笔画排序select * from MEMBER t order by NLSSORT(t.b,NLS_SORT SCHINESE_STROKE_M)3.按部首排序select * from MEMBER t order by NLSSORT(t.b,NLS_SORT SCHINESE_RADICAL_M)java 汉字按照拼音排序数据库中按照拼音排序很简单SELECT DISTINCT province_name, province_code FROM metadata_township ORDER BY convert(province_name USING gbk) asc一般的排序都是能正确的但是有的多音字啥的会有点差别例如重庆按理说是重是“chong”但是排序的时候会按照“zhong”,就会排在靠后的。Java中按照拼音排序我的list里面是对象对象里面含有需要按照拼音排序的字段name我用的lambda表达式来简化代码。/***(o1, o2) - Collator.getInstance(Locale.CHINA).compare(o1.getName(), o2.getName()) 排序规则根据汉字的拼音来排序升序* list 是需要排序的集合*/Collections.sort(list,(o1, o2) - Collator.getInstance(Locale.CHINA).compare(o1.getName(), o2.getName()));根据这个得到的排序大部分都是正确的跟前面sql里面排序的结果差不多多音字生僻字会不准确。默认的Collection.sort()是按照ASCII码排序, 不过, 有第二个重载方法, 第二个参数可以传入Comparator对象java.text.Collator可以用于本地语言排序, 自身已经实现Comparator接口.Collator.getInstance(Locale.CHINA)获取到我们中文的Collator实例/** * 按照拼音首字母排序 */ Test public void test() { ListString data new ArrayList(Arrays.asList(上海, 天津, 北京, 深圳, 广州, 成都, 西安, 武汉, 郑州, 邯郸, a, z, A, Z)); Collator collator Collator.getInstance(Locale.CHINA); Collections.sort(data, collator); for (String str : data) { System.out.print(str ); } }java实现按拼音排序ListWaPayFileVO list (ListWaPayFileVO) dao.execQueryBeanList(pagesql, params.toArray(), new BeanListProcessor(WaPayFileVO.class)); if(asc.equals(page.getOrder()) pk_psnjob__pk_psndoc__name.equals(page.getSort())){ Collections.sort(list, new ComparatorWaPayFileVO() { Override public int compare(WaPayFileVO o1, WaPayFileVO o2) { return Collator.getInstance(Locale.CHINESE).compare(o1.getPk_psnjob__pk_psndoc__name(),o2.getPk_psnjob__pk_psndoc__name()); } }); }else if(desc.equals(page.getOrder()) pk_psnjob__pk_psndoc__name.equals(page.getSort())){ Collections.sort(list, new ComparatorWaPayFileVO() { Override public int compare(WaPayFileVO o1, WaPayFileVO o2) { return -Collator.getInstance(Locale.CHINESE).compare(o1.getPk_psnjob__pk_psndoc__name(),o2.getPk_psnjob__pk_psndoc__name()); } }); }jdk自带的Collator包涵的汉字太少了对一些生僻的姓氏不能进行排序。推荐使用import com.ibm.icu.text.Collator;是ibm开发的针对编码的工具包非常好用。附pom文件dependency groupIdcom.ibm.icu/groupId artifactIdicu4j/artifactId version57.1/version /dependency业务场景一个list集合里面add了若干个实体类针对该实体类排序的属性为String。使用技术自定义list排序JDK自带重写Comparator接口的compare方法汉字转拼音技术使用的pinyin4j。pinyin4j官网地址http://pinyin4j.sourceforge.net/不想去官网下载的我这里也有地址为//tempRateList 为需要进行自定义排序的集合SpRate为该集合的实体类riskName为排序的属性。直接上方案1、导入pinyin4j-2.5.0.jar2、对自定义排序的类使用以下方法进行自定义排序Collections.sort(tempRateList,new ComparatorSpRate() {Overridepublic int compare(SpRate s1, SpRate s2) {String o1 s1.getRiskName();String o2 s2.getRiskName();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 PinyinHelper.toHanyuPinyinStringArray((char) codePoint1) null? null : PinyinHelper.toHanyuPinyinStringArray((char) codePoint1)[0];String pinyin2 PinyinHelper.toHanyuPinyinStringArray((char) codePoint2) null? null : PinyinHelper.toHanyuPinyinStringArray((char) codePoint2)[0];if (pinyin1 ! null pinyin2 ! null) { // 两个字符都是汉字if (!pinyin1.equals(pinyin2)) {return pinyin1.compareTo(pinyin2);}} else {return codePoint1 - codePoint2;}}}return o1.length() - o2.length();}});3、方法结束后 tempRateList 对象就完成了自定义排序
返回列表