按照拼音排序的几种方案:
其中 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);
}
}