JAVA汉字排序

按照拼音排序的几种方案:

其中 test1 不太理想;test2和test3比较好,test2依赖jar包小,运行速度也算不错。

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 com.ibm.icu.text.Transliterator;

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

public class OrderTest {

	private final static Comparator<Object> CHINA_COMPARE = Collator.getInstance(java.util.Locale.CHINA);

	public static void test1() {
		// 其结果显然不是按照拼音排序
		List<String> cityList = new ArrayList<String>();
		cityList.add("上海");
		cityList.add("北京");
		cityList.add("深圳");
		cityList.add("广州");
		cityList.add("倩影");
		cityList.add("茜影");

		Collections.sort(cityList, CHINA_COMPARE);
		System.out.println(cityList);
	}

	public static void test2() {
		long t1 = System.currentTimeMillis();
		String[] hanyuPinyinStringArray = PinyinHelper.toHanyuPinyinStringArray('你');
		System.out.println(Arrays.toString(hanyuPinyinStringArray));
		System.out.println(Arrays.toString(PinyinHelper.toHanyuPinyinStringArray('囧')));
		System.out.println(System.currentTimeMillis() - t1);
		try {
			HanyuPinyinOutputFormat hanyuPinyinOutputFormat = new HanyuPinyinOutputFormat();
			hanyuPinyinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
			String pinyinString = PinyinHelper.toHanYuPinyinString("坠落了", hanyuPinyinOutputFormat, "", false);
			System.out.println(pinyinString);
		} catch (BadHanyuPinyinOutputFormatCombination e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void test2_2() {
		
		long t1 = System.currentTimeMillis();

		List<String> cityList = new ArrayList<String>();
		cityList.add("上海");
		cityList.add("北京");
		cityList.add("深圳");
		cityList.add("广州");
		cityList.add("倩影");
		cityList.add("茜影");
		
		Collections.sort(cityList, new Comparator<String>() {
			HanyuPinyinOutputFormat hanyuPinyinOutputFormat = new HanyuPinyinOutputFormat();
			{
				hanyuPinyinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
			}
			@Override
			public int compare(String o1, String o2) {
				try {
					return PinyinHelper.toHanYuPinyinString(o1, hanyuPinyinOutputFormat, "", false).compareTo(PinyinHelper.toHanYuPinyinString(o2, hanyuPinyinOutputFormat, "", false));
				} catch (BadHanyuPinyinOutputFormatCombination e) {
					return 0;
				}
			}
		});
		
		System.out.println(cityList);
		System.out.println(System.currentTimeMillis() - t1);
	}

	public static void test3() {
		long t1 = System.currentTimeMillis();

		com.ibm.icu.text.Collator collator = com.ibm.icu.text.Collator.getInstance(Locale.CHINESE);
		List<String> cityList = new ArrayList<String>();
		cityList.add("上海");
		cityList.add("北京");
		cityList.add("深圳");
		cityList.add("广州");
		cityList.add("倩影");
		cityList.add("茜影");

		Collections.sort(cityList, collator);
		System.out.println(cityList);

		System.out.println(System.currentTimeMillis() - t1);

		Transliterator transliterator = Transliterator
				.getInstance("Han-Latin;NFD;[[:NonspacingMark:][:Space:]] Remove");
		String transliterate = transliterator.transliterate("茜影");
		System.out.println(transliterate);
	}

	public static void main(String[] args) {
		test2_2();
	}

}

pom.xml dependencies

	<dependencies>

		<dependency>
			<groupId>com.belerweb</groupId>
			<artifactId>pinyin4j</artifactId>
			<version>2.5.1</version>
		</dependency>

		<dependency>
			<groupId>com.ibm.icu</groupId>
			<artifactId>icu4j</artifactId>
			<version>60.2</version>
		</dependency>

	</dependencies>

比较器实现:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
/**
 * 比较器工具类
 */
public class Comparators {
	
	/**
	 * 汉语拼音比较器,可以用来做汉字排序,按照拼音排序。升序排序。
	 * @return
	 */
	public static Comparator<String> pinyinComparator() {
		return pinyinComparator(true);
	}

	/**
	 * 汉语拼音比较器,可以用来做汉字排序,按照拼音排序
	 * @param asc true 升序排序, false 降序排序
	 * @return
	 */
	public static Comparator<String> pinyinComparator(boolean asc) {
		HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
		// 拼音格式:无声调
		format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		return new Comparator<String>() {
			final int flag = asc ? 1 : -1;
			@Override
			public int compare(String o1, String o2) {
				try {
					return flag * PinyinHelper.toHanYuPinyinString(o1, format, "", true)
							.compareTo(PinyinHelper.toHanYuPinyinString(o2, format, "", true));
				} catch (BadHanyuPinyinOutputFormatCombination e) {
				}
				return 0;
			}
		};

	}

	public static void main(String[] args) {
		
		List<String> cityList = new ArrayList<String>();
		cityList.add("上海");
		cityList.add("北京");
		cityList.add("深圳");
		cityList.add("广州");
		cityList.add("倩影");
		cityList.add("茜影");
		cityList.add("上海");
		cityList.add("北京");
		cityList.add("深圳");
		cityList.add("广州");
		cityList.add("倩影");
		cityList.add("茜影");
		cityList.add("上海");
		cityList.add("北京");
		cityList.add("深圳");
		cityList.add("广州");
		cityList.add("倩影");
		cityList.add("茜影");
		
		Collections.sort(cityList, pinyinComparator(false));
		
		System.out.println(cityList);

	}

}

 

转载于:https://my.oschina.net/tita/blog/3001480

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值