pinyin4j項目 官網地址 http://pinyin4j.sourceforge.net/
我們先把資源下載下來,連同源碼和jar包一起放入工程。如下圖:

接下來在demo包下,我們寫一個測試類,簡單使用pinyin4j對中文字符進行自然排序
新建一個ConvertTest.java
package demo;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.List;import java.util.Map;import net.sourceforge.pinyin4j.PinyinHelper;public class ConvertTest { public static void main(String[] args) { String src = "我們中間出了一個叛徒"; char[] arr = src.toCharArray(); System.out.輸出結果為:

可以看到最終的輸出順序已經是按照自然順序排序后的結果了。
簡單說一下步驟:
1.我們先將字符串序列轉換成 單個字符key, 首字母value 的map形式,
如{個=g, 徒=t, 我=w, 出=c, 叛=p, 了=l, 中=z, 一=y, 間=j, 們=m}。
2. 然后針對map中的value進行排序,并返回排序過后的key值。
(PS:當然這里也可以對key值進行排序,但是最好還是針對value。
因為我們這里截取的是首字母,并不是整個拼音音節。)
代碼缺點:
1.只是針對中文字符的第一個拼音進行排序,但是漢語中存在多音字。
2.只是針對字符的首字母進行排序,并不是整個拼音音節,并不嚴謹,適合粗略排序的場景。
下面簡單分析一下,pinyin4j的轉換流程。

如上圖,其中核心的類就是PinyinHelper。它可以轉換許多類型的拼音,這里我們只看漢語拼音,其他的與之類似。
追蹤代碼PinyinHelper.toHanyuPinyinStringArray
按ctrl + 鼠標左鍵。
static public String[] toHanyuPinyinStringArray(char ch) { return getUnformattedHanyuPinyinStringArray(ch); }繼續跟蹤代碼
private static String[] getUnformattedHanyuPinyinStringArray(char ch) { return ChineseToPinyinResource.getInstance().getHanyuPinyinStringArray(ch); }調用ChineseToPinyinResource示例的getHanyuPinyinStringArray方法
String[] getHanyuPinyinStringArray(char ch) { String pinyinRecord = getHanyuPinyinRecordFromChar(ch); if (null != pinyinRecord) { //得到左括號( 的索引值 int indexOfLeftBracket = pinyinRecord.indexOf(Field.LEFT_BRACKET); //得到右括號) 的索引值 int indexOfRightBracket = pinyinRecord.lastIndexOf(Field.RIGHT_BRACKET); //得到字符對應的拼音 String stripedString = pinyinRecord.substring(indexOfLeftBracket + Field.LEFT_BRACKET.length(), indexOfRightBracket); //以逗號.為分隔 返回String[] 數組 return stripedString.split(Field.COMMA); } else return null; // no record found or mal-formatted record }關鍵的方法getHanyuPinyinRecordFromChar
private String getHanyuPinyinRecordFromChar(char ch) { int codePointOfChar = ch; //轉換成unicode對應的編碼 String codepointHexStr = Integer.toHexString(codePointOfChar).toUpperCase(); //從表中查詢字符 // fetch from hashtable String foundRecord = getUnicodeToHanyuPinyinTable().getProperty(codepointHexStr); //如果是合法的字符就返回,否則返回null return isValidRecord(foundRecord) ? foundRecord : null; }就是如下圖的資源:

新聞熱點
疑難解答