词语搜索算法思想 - 第五步 结构实现
生活随笔
收集整理的這篇文章主要介紹了
词语搜索算法思想 - 第五步 结构实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為什么80%的碼農都做不了架構師?>>> ??
第四步我們完成了組合的數組,現在我們需要對接第二步的方法,先做一個數組結合成字符串方法:
????public static void main(String[] args) {String item = "娛樂八卦"; // System.out.println(Arrays.toString(split(item))); // System.out.println(Arrays.toString(split("ylbg"))); // System.out.println(Arrays.toString(split("yu,le,ba,gua")));ArrayList<String[]> list = pinyin(item); // for (String[] arr : list) { // System.out.println(Arrays.toString(arr)); // } // CompositeUtil<String> t = new CompositeUtil<String>(list); // for (String[] strings : t.getResult()) { // System.out.println(Arrays.toString(strings)); // }System.out.println(Arrays.toString(composite(list)));}/*** 拼音組合*/public static String[] composite(ArrayList<String[]> list) {StringBuffer buff = new StringBuffer();CompositeUtil<String> t = new CompositeUtil<String>(list);List<String[]> result = t.getResult();int length = result.size();String[] back = new String[length];for (int i = 0; i < length; i++) {buff = new StringBuffer();for (String s : result.get(i)) {if (buff.length() > 0)buff.append(",");buff.append(s);}back[i] = buff.toString();}return back;}
輸出:
[yu,le,ba,gua, yu,yue,ba,gua]
現在對每個組合進行分割:
????public static void main(String[] args) {String item = "娛樂八卦"; // System.out.println(Arrays.toString(split(item))); // System.out.println(Arrays.toString(split("ylbg"))); // System.out.println(Arrays.toString(split("yu,le,ba,gua")));ArrayList<String[]> list = pinyin(item); // for (String[] arr : list) { // System.out.println(Arrays.toString(arr)); // } // CompositeUtil<String> t = new CompositeUtil<String>(list); // for (String[] strings : t.getResult()) { // System.out.println(Arrays.toString(strings)); // }String[] pinyin = composite(list);System.out.println(Arrays.toString(pinyin));for (String p : pinyin)System.out.println(Arrays.toString(split(p)));}
輸出:
[yu,le,ba,gua, yu,yue,ba,gua] [y, yu, yu, yul, yule, yule, yuleb, yuleba, yuleba, yulebag, yulebagu, yulebagua, l, le, le, leb, leba, leba, lebag, lebagu, lebagua, b, ba, ba, bag, bagu, bagua, g, gu, gua] [y, yu, yu, yuy, yuyu, yuyue, yuyue, yuyueb, yuyueba, yuyueba, yuyuebag, yuyuebagu, yuyuebagua, y, yu, yue, yue, yueb, yueba, yueba, yuebag, yuebagu, yuebagua, b, ba, ba, bag, bagu, bagua, g, gu, gua]
我們還有一個小問題沒有解決,就是詞語拼音首個字母組合,有以上的基礎,我們只要稍微修改下就能滿足我們的需求:
????public static void main(String[] args) {boolean first = true;String item = "娛樂八卦"; // System.out.println(Arrays.toString(split(item, first))); // System.out.println(Arrays.toString(split("ylbg", first))); // System.out.println(Arrays.toString(split("yu,le,ba,gua")));ArrayList<String[]> list = pinyin(item, first);for (String[] arr : list) {System.out.println(Arrays.toString(arr));} // CompositeUtil<String> t = new CompositeUtil<String>(list); // for (String[] strings : t.getResult()) { // System.out.println(Arrays.toString(strings)); // }String[] pinyin = composite(list, first);System.out.println(Arrays.toString(pinyin));for (String p : pinyin)System.out.println(Arrays.toString(split(p, first)));}/*** 拼音組合*/public static String[] composite(ArrayList<String[]> list, boolean first) {StringBuffer buff = new StringBuffer();CompositeUtil<String> t = new CompositeUtil<String>(list);List<String[]> result = t.getResult();int length = result.size();String[] back = new String[length];for (int i = 0; i < length; i++) {buff = new StringBuffer();for (String s : result.get(i)) {if (!first && buff.length() > 0)buff.append(",");buff.append(s);}back[i] = buff.toString();}return back;}/*** 詞語拼音*/public static ArrayList<String[]> pinyin(String s, boolean first) {HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); // 小寫defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); // 不用聲標String[] pinyinArray = null;ArrayList<String> temp;ArrayList<String[]> list = new ArrayList<String[]>();for (char c : s.toCharArray()) {try {pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c,defaultFormat);} catch (BadHanyuPinyinOutputFormatCombination e) {e.printStackTrace();}if (pinyinArray == null) {list.add(new String[] { String.valueOf(c) });} else {temp = new ArrayList<String>();for (String p : pinyinArray) {if (first) {if (!temp.contains(p.substring(0, 1))) {temp.add(p.substring(0, 1));}} else {if (!temp.contains(p)) {temp.add(p);}}}list.add(temp.toArray(new String[temp.size()]));}}return list;}/*** 切割詞語*/public static String[] split(String s, boolean first) {int next = 0;String temp = "";int len = s.length();ArrayList<String> list = new ArrayList<String>();for (int i = 0; i < len; i++) {if (s.charAt(i) == ',') {next = 0;} else {if (i != 0 && next == 0)next = 1;}if (first || next == 0)for (int j = i + 1; j <= len; j++) {temp = s.substring(i, j).replace(",", "");if (temp.length() > 0)list.add(temp);}}return list.toArray(new String[list.size()]);}
對composite、pinyin和split方法加入first參數,表示如果想獲得拼音首個字母,傳入true,否則傳入false。輸出:
[ylbg, yybg] [y, yl, ylb, ylbg, l, lb, lbg, b, bg, g] [y, yy, yyb, yybg, y, yb, ybg, b, bg, g]
搜索數據機構已經準備完畢,接下來只是把這些準備好的東西實現需要的數據結構了:
public static void main(String[] args) { // boolean first = true; // String item = "娛樂八卦"; // System.out.println(Arrays.toString(split(item, first))); // System.out.println(Arrays.toString(split("ylbg", first))); // System.out.println(Arrays.toString(split("yu,le,ba,gua"))); // ArrayList<String[]> list = pinyin(item, first); // for (String[] arr : list) { // System.out.println(Arrays.toString(arr)); // } // CompositeUtil<String> t = new CompositeUtil<String>(list); // for (String[] strings : t.getResult()) { // System.out.println(Arrays.toString(strings)); // } // String[] pinyin = composite(list, first); // System.out.println(Arrays.toString(pinyin)); // for (String p : pinyin) // System.out.println(Arrays.toString(split(p, first))); // String[] items = { "娛樂八卦", "經濟論壇" };HashMap<String, ArrayList<String>> map = map(items);System.out.println(map);}/*** 構造數據結構*/public static HashMap<String, ArrayList<String>> map(String[] items) {ArrayList<String> values = new ArrayList<String>();HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();String[] temp;for (String item : items) {// 中文詞語切割temp = split(item, true);for (String t : temp) {if (map.containsKey(t)) {if (!map.get(t).contains(item))map.get(t).add(item);} else {values = new ArrayList<String>();values.add(item);map.put(t, values);}}// 中文拼音首個字母temp = composite(pinyin(item, true), true);for (String str : temp) {for (String t : split(str, true)) {if (map.containsKey(t)) {if (!map.get(t).contains(item))map.get(t).add(item);} else {values = new ArrayList<String>();values.add(item);map.put(t, values);}}}// 中文拼音temp = composite(pinyin(item, false), false);for (String str : temp) for (String t : split(str, false)) {if (map.containsKey(t)) {if (!map.get(t).contains(item))map.get(t).add(item);} else {values = new ArrayList<String>();values.add(item);map.put(t, values);}}}return map;}
輸出結構:
{yulebag=[娛樂八卦], 經濟論=[經濟論壇], jingjilu=[經濟論壇], yuyuebagu=[娛樂八卦], yuyuebag=[娛樂八卦], 經濟論壇=[經濟論壇], lun=[經濟論壇], gua=[娛樂八卦], bagua=[娛樂八卦], lebag=[娛樂八卦], jingjilunta=[經濟論壇], 論=[經濟論壇], luntan=[經濟論壇], 娛=[娛樂八卦], jilun=[經濟論壇], yuy=[娛樂八卦], bag=[娛樂八卦], yul=[娛樂八卦], 樂=[娛樂八卦], ylb=[娛樂八卦], yue=[娛樂八卦], 娛樂八卦=[娛樂八卦], yuyue=[娛樂八卦], gu=[娛樂八卦], tan=[經濟論壇], ylbg=[娛樂八卦], jingjiluntan=[經濟論壇], yybg=[娛樂八卦], 濟=[經濟論壇], lu=[經濟論壇], lt=[經濟論壇], 論壇=[經濟論壇], 娛樂=[娛樂八卦], yuebagu=[娛樂八卦], 八卦=[娛樂八卦], jiluntan=[經濟論壇], jingjil=[經濟論壇], g=[娛樂八卦], 樂八卦=[娛樂八卦], b=[娛樂八卦], yuyueb=[娛樂八卦], l=[娛樂八卦, 經濟論壇], j=[經濟論壇], yulebagu=[娛樂八卦], t=[經濟論壇], yuebag=[娛樂八卦], yuyu=[娛樂八卦], leb=[娛樂八卦], y=[娛樂八卦], lunt=[經濟論壇], 壇=[經濟論壇], jl=[經濟論壇], jj=[經濟論壇], jin=[經濟論壇], jil=[經濟論壇], jingji=[經濟論壇], ta=[經濟論壇], jingjilunt=[經濟論壇], bg=[娛樂八卦], yyb=[娛樂八卦], yuyuebagua=[娛樂八卦], jingj=[經濟論壇], yulebagua=[娛樂八卦], leba=[娛樂八卦], jjl=[經濟論壇], le=[娛樂八卦], 經濟=[經濟論壇], lb=[娛樂八卦], jilunt=[經濟論壇], 樂八=[娛樂八卦], yuyueba=[娛樂八卦], yueb=[娛樂八卦], jilunta=[經濟論壇], yy=[娛樂八卦], yueba=[娛樂八卦], lebagu=[娛樂八卦], 經=[經濟論壇], jjlt=[經濟論壇], 八=[娛樂八卦], jilu=[經濟論壇], yuleba=[娛樂八卦], ybg=[娛樂八卦], lebagua=[娛樂八卦], ba=[娛樂八卦], 娛樂八=[娛樂八卦], yb=[娛樂八卦], jlt=[經濟論壇], jing=[經濟論壇], jingjilun=[經濟論壇], lunta=[經濟論壇], 濟論=[經濟論壇], yuleb=[娛樂八卦], 濟論壇=[經濟論壇], lbg=[娛樂八卦], yu=[娛樂八卦], 卦=[娛樂八卦], yuebagua=[娛樂八卦], ji=[經濟論壇], yule=[娛樂八卦], bagu=[娛樂八卦], yl=[娛樂八卦]}
到這里,可以解決這個問題了,能否更好解決這個問題?
轉載于:https://my.oschina.net/fangxu/blog/41569
總結
以上是生活随笔為你收集整理的词语搜索算法思想 - 第五步 结构实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三维模型部件分离
- 下一篇: MOS2010的界面介绍和定制方法简介【