java對中文(拼音)進行排序
拼音排序
拼音有好幾種方式,其中最主要的是中華人民共和國的漢語拼音 Chinese Phonetic。對漢字的排序有兩種:一種是寬鬆的,能夠按拼音排序最常用的漢字,另一種是嚴格的,能夠按拼音排序絕大部分大部分漢字。
寬鬆的拼音排序法
原理:漢字最早是GB2312編碼,收錄了六千多個漢字,是按拼音排序的,編碼是連續的。 後來出現了GBK編碼,對GB2312進行了擴充套件,到了兩萬多漢字,並且相容GB2312,也就是說GB2312中的漢字編碼是原封不動搬到GBK中的(在GBK編碼中[B0-D7]區中)。
如果我們只關心這6000多個漢字的順序,就可以用下面的方法實現漢字寬鬆排序。
package com.zhaosoft.chinese.utility;
import java.text.Collator;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
/**
* @author zhaosoft
*/
public class PinyinSimpleComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return Collator.getInstance(Locale.CHINESE).compare(o1, o2);
}
public static void main(String[] args) {
String[] data = { "孫", "孟", "宋", "尹", "廖", "張", "徐", "昆","曹", "曾", "怡" };
List<String> list = Arrays.asList(data);
Arrays.sort(data, new PinyinSimpleComparator());
System.out.println(list);
}
}
在對[孫, 孟, 宋, 尹, 廖, 張, 徐, 昆, 曹, 曾,怡]這幾個漢字排序,結果是:[曹, 昆, 廖, 孟, 宋, 孫, 徐, 尹, 曾, 張, 怡]。最後一個 怡 有問題,不該排在最後的。
注意:這個程式有兩個不足
由於gb2312中的漢字編碼是連續的,因此新增加的漢字不可能再按照拼音順序插入到已有的gb2312編碼中,所以新增加的漢字不是按拼音順序排的。
同音字比較的結果不等於0 。
下面的測試程式碼可以證明
/**
* 非常用字(怡)
*/
@Test
public void testNoneCommon() {
Assert.assertTrue(comparator.compare("怡", "張") > 0);
}
/**
* 同音字
*/
@Test
public void testSameSound() {
Assert.assertTrue(comparator.compare("怕", "帕") != 0);
}
嚴格的拼音排序法
為了解決寬鬆的拼音的兩點不足,可以通過實現漢語拼音的函式來解決。goolge下看到sf上有個pinyin4j的專案,可以解決這個問題,pinyin4j的專案地址是:http://pinyin4j.sourceforge.net/。
實現程式碼:
package com.zhaosoft.chinese.utility;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import net.sourceforge.pinyin4j.PinyinHelper;
/**
* @author zhaosoft
*/
public class PinyinComparator implements Comparator<String> {
private String concatPinyinStringArray(String[] pinyinArray) {
StringBuffer pinyinStrBuf = new StringBuffer();
if ((null != pinyinArray) && (pinyinArray.length > 0)) {
for (int i = 0; i < pinyinArray.length; i++) {
pinyinStrBuf.append(pinyinArray[i]);
}
}
String outputString = pinyinStrBuf.toString();
return outputString;
}
@Override
public int compare(String o1, String o2) {
char c1 = ((String) o1).charAt(0);
char c2 = ((String) o2).charAt(0);
return concatPinyinStringArray(
PinyinHelper.toHanyuPinyinStringArray(c1)).compareTo(
concatPinyinStringArray(PinyinHelper
.toHanyuPinyinStringArray(c2)));
}
public static void main(String[] args) {
String[] data = { "孫", "孟", "宋", "尹", "廖", "張", "張", "張", "徐", "昆","曹", "曾", "怡" };
List<String> list = Arrays.asList(data);
Arrays.sort(data, new PinyinComparator());
System.out.println(list);
}
}
輸出結果:
[曹, 曾, 昆, 廖, 孟, 宋, 孫, 徐, 怡, 尹, 張, 張, 張]
相關文章
- Java使用Collections對中文字元進行首字母排序Java字元排序
- mysql按照漢字拼音進行order by排序MySql排序
- 對字典進行排序排序
- 在Java中對集合當中的物件進行排序Java物件排序
- elasticsearch實戰—中文拼音A-Z排序(完美解決)Elasticsearch排序
- elasticsearch實戰---中文拼音A-Z排序(完美解決)Elasticsearch排序
- Python對字典進行排序Python排序
- 對N個數進行排序排序
- mysql的中文資料按拼音排序的2個方法MySql排序
- python 對字典的值進行排序Python排序
- 一個命令對文字進行高效排序排序
- ORDER對查詢結果進行排序排序
- 使用XPathExpression類對XML進行排序 (轉)ExpressXML排序
- JS 中文轉拼音JS
- js實現的讓文字以拼音首字母順序進行排序程式碼JS排序
- 使用Collections對list的內容進行排序排序
- Js比較對Object型別進行排序JSObject型別排序
- 如何在dhtmlxGantt網格中對任務進行排序和重新排序HTML排序
- 如何在Python中對dicts列表進行排序Python排序
- Django(76)isort工具對import匯入進行排序DjangoImport排序
- 對N個數進行從大到小排序排序
- 對list集合中的物件進行排序(轉載)物件排序
- 關於java中實現在oracle資料庫中實現對中文首字母進行排序的解決方案JavaOracle資料庫排序
- 用java.util.Collections中的sort方法對兩個類的物件進行排序Java物件排序
- js 漢字按照拼音排序效果JS排序
- 4.10 如何在Java中進行排序開發Java排序
- 用xgboost模型對特徵重要性進行排序模型特徵排序
- 147. 對連結串列進行插入排序排序
- iOS中對NSArray中自定義的物件進行排序iOS物件排序
- 使用oracle decode對錶字元列進行order by 排序Oracle字元排序
- Java -- 對List集合進行分頁Java
- Oracle資料庫中文拼音,部首,筆畫排序問題,NLS_SORT設定Oracle資料庫排序
- java排序方式對比Java排序
- java stream()流對兩個集合進行比對Java
- Java stream sorted使用 Comparator 進行多欄位排序Java排序
- JavaScript按照漢字拼音順序排序JavaScript排序
- js 漢字陣列按拼音排序JS陣列排序
- 如何對JAVA物件進行深拷貝Java物件