Java中文排序

功能需求对集合对象按照几个字段进行排序,在MySQL中直接使用order by得到的结果并不是根据拼音排序

 

打算在代码中 处理,测试方法如下:

 

package com.dz;

import java.text.Collator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;

import org.junit.Before;
import org.junit.Test;

import com.dz.baoguan.vo.DetailListBC;

import net.sourceforge.pinyin4j.PinyinHelper;

public class ChineseSortTest {

	public List list = null;
	
	@Before
	public void initArr() {
		String[] arr = new String[]{"黑灰","白","橘红","海之蓝","红","黑黄","灰","灰白","黑","灰绿","黑紫","天之蓝"};
		list = Arrays.asList(arr);
	}
	
	@Test
	public void testSort() {
		System.out.println("原始顺序:" + list.toString());
		collectionSort(list);
		comparatorSort(list);
		collatorSort(list);
		pinYinSort(list);
	}
	
	public void collectionSort(List list) {
		Collections.sort(list);
		System.out.println("Collections.sort排序:" + list.toString());//Collections.sort排序:[天之蓝, 橘红, 海之蓝, 灰, 灰白, 灰绿, 白, 红, 黑, 黑灰, 黑紫, 黑黄]
	}
	
	public void comparatorSort(List list) {
		Collections.sort(list, new Comparator() {
			public int compare(String o1, String o2) {
				return  o1.compareTo(o2);
			}
		});
		System.out.println("Comparatort排序:" + list.toString());//Comparatort排序:[天之蓝, 橘红, 海之蓝, 灰, 灰白, 灰绿, 白, 红, 黑, 黑灰, 黑紫, 黑黄]
	}
	
	public void collatorSort(List list) {
		Collections.sort(list, new Comparator() {
			public int compare(String o1, String o2) {
				return compareSimple(o1, o2);
			}
		});
		System.out.println("一、红, 红 对比结果:" + compareSimple("红", "红"));//0
		System.out.println("一、红, 洪 对比结果:" + compareSimple("红", "洪"));//1,非0
		System.out.println("Collator排序:" + list.toString());//Collator排序:[白, 海之蓝, 黑, 黑黄, 黑灰, 黑紫, 红, 灰, 灰白, 灰绿, 天之蓝, 橘红]
	}
	
	//宽松拼音排序
	private int compareSimple(String o1, String o2) {
		
		return Collator.getInstance(Locale.CHINESE).compare(o1, o2); 
	}
	
	public void pinYinSort(List list) {
		Collections.sort(list, new Comparator() {
			public int compare(String o1, String o2) {
				return compareComplex(o1, o2);
			}
		});
		System.out.println("二、红, 红 对比结果:" + compareSimple("红", "红"));//0
		System.out.println("二、红, 洪 对比结果:" + compareSimple("红", "洪"));//1,非0
		System.out.println("拼音排序:" + list.toString());//拼音排序:[白, 海之蓝, 黑, 黑黄, 黑灰, 黑紫, 红, 灰, 灰白, 灰绿, 橘红, 天之蓝]
	}
	
	private int compareComplex(String o1, String o2) {
		 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();
	}
	
	/**
     * 字符的拼音,多音字就得到第一个拼音。不是汉字,就return null。
     */
    private String pinyin(char c) {
        String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);
        if (pinyins == null) {
            return null;
        }
        return pinyins[0];
    }
}
 list = null;
	
	@Before
	public void initArr() {
		String[] arr = new String[]{"黑灰","白","橘红","海之蓝","红","黑黄","灰","灰白","黑","灰绿","黑紫","天之蓝"};
		list = Arrays.asList(arr);
	}
	
	@Test
	public void testSort() {
		System.out.println("原始顺序:" + list.toString());
		collectionSort(list);
		comparatorSort(list);
		collatorSort(list);
		pinYinSort(list);
	}
	
	public void collectionSort(List list) {
		Collections.sort(list);
		System.out.println("Collections.sort排序:" + list.toString());//Collections.sort排序:[天之蓝, 橘红, 海之蓝, 灰, 灰白, 灰绿, 白, 红, 黑, 黑灰, 黑紫, 黑黄]
	}
	
	public void comparatorSort(List list) {
		Collections.sort(list, new Comparator() {
			public int compare(String o1, String o2) {
				return  o1.compareTo(o2);
			}
		});
		System.out.println("Comparatort排序:" + list.toString());//Comparatort排序:[天之蓝, 橘红, 海之蓝, 灰, 灰白, 灰绿, 白, 红, 黑, 黑灰, 黑紫, 黑黄]
	}
	
	public void collatorSort(List list) {
		Collections.sort(list, new Comparator() {
			public int compare(String o1, String o2) {
				return compareSimple(o1, o2);
			}
		});
		System.out.println("一、红, 红 对比结果:" + compareSimple("红", "红"));//0
		System.out.println("一、红, 洪 对比结果:" + compareSimple("红", "洪"));//1,非0
		System.out.println("Collator排序:" + list.toString());//Collator排序:[白, 海之蓝, 黑, 黑黄, 黑灰, 黑紫, 红, 灰, 灰白, 灰绿, 天之蓝, 橘红]
	}
	
	//宽松拼音排序
	private int compareSimple(String o1, String o2) {
		
		return Collator.getInstance(Locale.CHINESE).compare(o1, o2); 
	}
	
	public void pinYinSort(List list) {
		Collections.sort(list, new Comparator() {
			public int compare(String o1, String o2) {
				return compareComplex(o1, o2);
			}
		});
		System.out.println("二、红, 红 对比结果:" + compareSimple("红", "红"));//0
		System.out.println("二、红, 洪 对比结果:" + compareSimple("红", "洪"));//1,非0
		System.out.println("拼音排序:" + list.toString());//拼音排序:[白, 海之蓝, 黑, 黑黄, 黑灰, 黑紫, 红, 灰, 灰白, 灰绿, 橘红, 天之蓝]
	}
	
	private int compareComplex(String o1, String o2) {
		 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();
	}
	
	/**
     * 字符的拼音,多音字就得到第一个拼音。不是汉字,就return null。
     */
    private String pinyin(char c) {
        String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);
        if (pinyins == null) {
            return null;
        }
        return pinyins[0];
    }
}

 

 

 

参考文章:http://www.cnblogs.com/coding-way/archive/2011/11/12/2246735.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值