java中文拼音字母排序

时间:2022-09-27 19:36:08

package com.yputil.util;

import java.text.CollationKey;
import java.text.Collator;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
* 按中文排序
*
* @author Administrator 时间:2017.8.22 PM
*/
public class ChineseSortUtil implements Comparator<Object> {

public ChineseSortUtil() {
}

public static boolean sortType = true;

private Collator coll = Collator.getInstance();// 查看中文api详解

@Override
public int compare(Object arg0, Object arg1) {

// 要想不区分大小写进行比较用o1.toString().toLowerCase()
CollationKey key1 = coll.getCollationKey(arg0.toString());
CollationKey key2 = coll.getCollationKey(arg1.toString());

// 降序加个"-"
if(sortType) //升序
return key1.compareTo(key2);
else
return -key1.compareTo(key2); //降序
}

/**
* 排序 1.Map 2.简单数组 3.List
*
* 根据中文字符排序
* sortType : true--升序 false--降序
* obj : 排序的对象
* 目前对Map没作用
*/
public static Object sortByChinese(Object obj,boolean sortType) {
ChineseSortUtil.sortType = sortType;
// Object objRet = null;
if (obj instanceof Map) { // map
mapSort((Map) obj);
} else if (obj instanceof List) { // List
listSort((List) obj);
} else if (obj instanceof String[]) { // String[] 数组
stringsSort((String[]) obj);
}
return obj;
}

/**
* strs 数组
*
* @param strs
*/
private static void stringsSort(String[] strs) {
Comparator<Object> com = Collator.getInstance(java.util.Locale.CHINA);
Arrays.sort(strs, com);
}

/**
* 说明:因为ArrayList实现的是RandomAccess 随机访问接口。使用get()要比迭代的效率高。
* 如果实现的是SequenceAccess(顺序访问接口。如:LinkList),使用迭代的效率高
*
* @param list
*/
private static void listSort(List list) {
ChineseSortUtil comparator = new ChineseSortUtil();
Collections.sort(list, comparator);
}

private static void mapSort(Map map) {
// 按照键值排序
ChineseSortUtil comparator = new ChineseSortUtil();
// 注意:每次对TreeMap进行put()时,TreeMap都会自动调用它的compare(key,Entry.key)
// 按照key进行排序
Collection col = map.keySet();
Iterator it = col.iterator();
/*
* while (it.hasNext()) { System.out.println(it.next()); }
*/

}

}