split To Valid Pinyin Tokens - Android Internationalization

Android examples for Internationalization:Pinyin

Description

split To Valid Pinyin Tokens

Demo Code


//package com.java2s;
import android.text.TextUtils;
import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap;

public class Main {
    private static ConcurrentHashMap<String, Boolean> validFuzzyPinyins = null;
    private static Object lock = new Object();
    public static final String[] validPinyins = {
            // "a", // 5
            "a",//from  w ww  .  ja v a  2s  .co m
            "ai",
            "an",
            "ang",
            "ao",
            // "b", //16
            "ba",
            "bai",
            "ban",
            "bang",
            "bao",
            "bei",
            "ben",
            "beng",
            "bi",
            "bian",
            "biao",
            "bie",
            "bin",
            "bing",
            "bo",
            "bu",
            // "c", //36
            "ca",
            "cai",
            "can",
            "cang",
            "cao",
            "ce",
            "cen",
            "ceng",
            "ch",
            "cha",
            "chai",
            "chan",
            "chang",
            "chao",
            "che",
            "chen",
            "cheng",
            "chi",
            "chong",
            "chou",
            "chu",
            "chua",
            "chuai",
            "chuan",
            "chuang",
            "chui",
            "chun",
            "chuo",
            "ci",
            "cong",
            "cou",
            "cu",
            "cuan",
            "cui",
            "cun",
            "cuo",
            // "d", //23
            "da",
            "dai",
            "dan",
            "dang",
            "dao",
            "de",
            "den",
            "dei",
            "deng",
            "di",
            "dia",
            "dian",
            "diao",
            "die",
            "ding",
            "diu",
            "dong",
            "dou",
            "du",
            "duan",
            "dui",
            "dun",
            "duo",
            // "e", // 5
            "e",
            "ei",
            "en",
            "eng",
            "er",
            // "f", //9
            "fa",
            "fan",
            "fang",
            "fei",
            "fen",
            "feng",
            "fo",
            "fou",
            "fu",
            // "g", //19
            "ga",
            "gai",
            "gan",
            "gang",
            "gao",
            "ge",
            "gei",
            "gen",
            "geng",
            "gong",
            "gou",
            "gu",
            "gua",
            "guai",
            "guan",
            "guang",
            "gui",
            "gun",
            "guo",
            // "h", //19
            "ha",
            "hai",
            "han",
            "hang",
            "hao",
            "he",
            "hei",
            "hen",
            "heng",
            "hong",
            "hou",
            "hu",
            "hua",
            "huai",
            "huan",
            "huang",
            "hui",
            "hun",
            "huo",
            // "j", //14
            "ji",
            "jia",
            "jian",
            "jiang",
            "jiao",
            "jie",
            "jin",
            "jing",
            "jiong",
            "jiu",
            "ju",
            "juan",
            "jue",
            "jun",
            // "k", //18
            "ka",
            "kai",
            "kan",
            "kang",
            "kao",
            "ke",
            "ken",
            "keng",
            "kong",
            "kou",
            "ku",
            "kua",
            "kuai",
            "kuan",
            "kuang",
            "kui",
            "kun",
            "kuo",
            // "l", //26
            "la",
            "lai",
            "lan",
            "lang",
            "lao",
            "le",
            "lei",
            "leng",
            "li",
            "lia",
            "lian",
            "liang",
            "liao",
            "lie",
            "lin",
            "ling",
            "liu",
            "long",
            "lou",
            "lu",
            "lv",
            "luan",
            "lue",
            "lve",
            "lun",
            "luo",
            // "m", //19
            "ma",
            "mai",
            "man",
            "mang",
            "mao",
            "me",
            "mei",
            "men",
            "meng",
            "mi",
            "mian",
            "miao",
            "mie",
            "min",
            "ming",
            "miu",
            "mo",
            "mou",
            "mu",
            // "n", //25
            "na",
            "nai",
            "nan",
            "nang",
            "nao",
            "ne",
            "nei",
            "nen",
            "neng",
            "ni",
            "nian",
            "niang",
            "niao",
            "nie",
            "nin",
            "ning",
            "niu",
            "nong",
            "nou",
            "nu",
            "nv",
            "nuan",
            "nve",
            "nuo",
            "nun",
            // "o", // 2
            "o",
            "ou",
            // "p", //17
            "pa", "pai", "pan",
            "pang",
            "pao",
            "pei",
            "pen",
            "peng",
            "pi",
            "pian",
            "piao",
            "pie",
            "pin",
            "ping",
            "po",
            "pou",
            "pu",
            // "q", //14
            "qi",
            "qia",
            "qian",
            "qiang",
            "qiao",
            "qie",
            "qin",
            "qing",
            "qiong",
            "qiu",
            "qu",
            "quan",
            "que",
            "qun",
            // "r", //14
            "ran", "rang",
            "rao",
            "re",
            "ren",
            "reng",
            "ri",
            "rong",
            "rou",
            "ru",
            "ruan",
            "rui",
            "run",
            "ruo",
            // "s", //36
            "sa", "sai", "san", "sang", "sao", "se", "sen", "seng", "sh",
            "sha", "shai", "shan", "shang", "shao", "she", "shei", "shen",
            "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan",
            "shuang", "shui", "shun", "shuo",
            "si",
            "song",
            "sou",
            "su",
            "suan",
            "sui",
            "sun",
            "suo",
            // "t", //19
            "ta", "tai", "tan", "tang", "tao", "te", "teng", "ti", "tian",
            "tiao", "tie", "ting", "tong",
            "tou",
            "tu",
            "tuan",
            "tui",
            "tun",
            "tuo",
            // "w", //9
            "wa", "wai", "wan", "wang",
            "wei",
            "wen",
            "weng",
            "wo",
            "wu",
            // "x", //14
            "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing",
            "xiong", "xiu",
            "xu",
            "xuan",
            "xue",
            "xun",
            // "y", //15
            "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yo",
            "yong", "you", "yu",
            "yuan",
            "yue",
            "yun",
            // "z", //38
            "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng",
            "zh", "zha", "zhai", "zhan", "zhang", "zhao", "zhe", "zhei",
            "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua",
            "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi",
            "zong", "zou", "zu", "zuan", "zui", "zun", "zuo" };

    public static ArrayList<ArrayList<String>> splitToValidPinyinTokens(
            String s) {
        ArrayList<ArrayList<String>> tokens = new ArrayList<ArrayList<String>>();
        pick(tokens, new ArrayList<String>(), s, 0);
        return tokens;
    }

    private static void pick(ArrayList<ArrayList<String>> splits,
            ArrayList<String> split, String keyword, int cursor) {
        if (cursor < keyword.length()) {
            int maxPickLength = keyword.length() - cursor;
            for (int pickLength = 1; pickLength <= maxPickLength; ++pickLength) {
                String pickString = keyword.substring(cursor, cursor
                        + pickLength);
                cursor += pickLength;
                if (isValidFuzzyPinyin(pickString)) {
                    split.add(pickString);
                    pick(splits, new ArrayList<String>(split), keyword,
                            cursor);
                    split.remove(split.size() - 1);
                }
                cursor -= pickLength;
            }
        } else {
            if (split.size() > 0) {
                splits.add(split);
            }
        }
    }

    public static boolean isValidFuzzyPinyin(String s) {
        if (null == validFuzzyPinyins) {
            initFuzzyPinyinMap();
        }
        if (TextUtils.isEmpty(s)) {
            return false;
        }
        Boolean result = validFuzzyPinyins.get(s);
        if (null == result) {
            return false;
        }
        return true;
    }

    public static void initFuzzyPinyinMap() {
        synchronized (lock) {
            if (null == validFuzzyPinyins) {
                validFuzzyPinyins = new ConcurrentHashMap<String, Boolean>();
                for (String pinyin : validPinyins) {
                    for (int i = 0; i < pinyin.length(); ++i) {
                        String s = pinyin.substring(0, i + 1);
                        validFuzzyPinyins.put(s, true);
                    }
                }
            }
        }
        return;
    }
}

Related Tutorials