/**
* 宽松的拼音排序法--有可能有的字不能正常排序
* 比较严谨的中文排序见类:
* PinyinComparator.java
**/
public static void sortArray()
{
// Collator 类是用来执行区分语言环境的 String 比较的,这里选择使用CHINA
Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);
String[] arr = {"张三", "李四", "王五", "刘六"};
// 使根据指定比较器产生的顺序对指定对象数组进行排序。
Arrays.sort(arr, cmp);
for (int i = 0; i < arr.length; i++)
{
System.out.println(arr[i]);
System.out.println();
}
}
import java.io.UnsupportedEncodingException;
/****
*
* 目标:实现一个汉字字符串按汉语拼音字典顺序排序。
* 原理:在windows环境的gbk字符集里,汉字是按汉语拼音字典顺序编码的,如“础”是B4A1,“储”是B4A2。
* 这里有个问题就像上面的储和础这样的同音字只能遵照编码的顺序了,另外多音字也得遵照编码顺序。
* 设计思路是先拆分汉字字符串为字符数组,获得每个汉字字符的16进制字符串表示,然后比较该字符串的字典顺序大小,排序。
* 需要说明的是,获得汉字字符的字节数组,转换成int比较也可,实现从略。
* @author Administrator
*
*/
public class CompareEveryCharOfString {
public static void main(String[] args) throws UnsupportedEncodingException {
String test = "我爱北京天安门";
test = sort(test, "gb2312");
System.out.println(test);
}
public static String sort(String s, String charset) {
char[] c = s.toCharArray();
for (int i = 0; i < c.length - 1; i++) {
for (int j = i + 1; j < c.length; j++) {
String chr1 = getHexString(new String(new char[] { c[i] }), charset);
String chr2 = getHexString(new String(new char[] { c[j] }), charset);
if (chr1.compareTo(chr2) > 0) {
char temp = c[i];
c[i] = c[j];
c[j] = temp;
}
}
}
return new String(c);
}
public static String getHexString(String s, String charset) {
byte[] b = null;
StringBuffer sb = new StringBuffer();
try {
b = s.getBytes(charset);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
for (int i = 0; i < b.length; i++) {
sb.append(Integer.toHexString(b[i] & 0XFF));
}
return sb.toString();
}
}