功能需求对集合对象按照几个字段进行排序,在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