国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

淺析pinyin4j源碼 簡單利用pinyin4j對中文字符進行自然排序

2019-11-15 01:10:34
字體:
來源:轉載
供稿:網友
淺析pinyin4j源碼 簡單利用pinyin4j對中文字符進行自然排序

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;    }

就是如下圖的資源:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 郑州市| 城市| 平潭县| 彰化市| 登封市| 阿鲁科尔沁旗| 包头市| 屏山县| 屯门区| 无极县| 临西县| 和田市| 汕尾市| 若羌县| 无锡市| 突泉县| 长海县| 高青县| 广丰县| 葫芦岛市| 凤冈县| 朝阳市| 屏东市| 平和县| 理塘县| 镇雄县| 宜章县| 衡阳县| 南通市| 政和县| 盐城市| 辽中县| 南康市| 浮山县| 措美县| 安丘市| 杭州市| 西吉县| 怀宁县| 兴仁县| 青浦区|