为什么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

词语搜索算法思想 - 第五步 结构实现相关推荐

  1. 模型理论5_英语学术论文摘要语步结构自动识别模型的构建

    提要:本文以 1993-2014 年期间 SSCI期刊< 应用语言学> 发表的学术论文摘要为语料,对英文摘要语步结构标注后,利用语料库和自然语言处理方法,提取有效语步预测特征,通过语步结构 ...

  2. “完形填空”五步解题法

    中考英语试题中的"完形填空"目前难度并不大,但是在初中阶段养成良好的解题习惯不仅为英语学习奠定一定基础,也为升入高中学习打下一定的阅读基本功. 现将五步解题法教给大家.经常操练,可 ...

  3. 【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术:Direct3D渲染五步曲...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8223965 作者:毛星云(浅墨 ...

  4. 【Visual C 】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术 Direct3D渲染五步曲

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  5. 【人工智能大作业】A*和IDA*搜索算法解决十五数码(15-puzzle)问题 (Python实现)(启发式搜索)

    Astar和IDAstar搜索算法解决十五数码(15-puzzle)问题 (文末附实现代码,此前为理论与具体问题分析) 文章目录 Astar和IDAstar搜索算法解决十五数码(15-puzzle)问 ...

  6. 【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术 Direct3D渲染五步曲

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8223965 作者:毛星云(浅墨 ...

  7. 【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术:Direct3D渲染五步曲

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8223965 作者:毛星云(浅墨 ...

  8. [EntLib]微软企业库5.0 学习之路——第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇...

    本文是为后面的学习之路做铺垫,简单介绍下企业库中的Validation模块的一些相关知识,包括Validation模块的简介.用途.使用方法.默认提供的多种验证器的介绍等. 一.简介及用途 在实际的项 ...

  9. jmeter java接口_JMeter接口Java开发五步曲

    想做jmeter接口二次开发但不知道如何入手,要解决这个问题,我们可以分为5个步骤 第一步:了解jmeter处理java请求的流程 第二步:通过实现jmeter中的接口JavaSamplerClien ...

最新文章

  1. gen_caltab自治标定板
  2. 相机上的AE AF AWB AEB都表示的是什么?
  3. c++ string 另类写法
  4. python实现pdf转word详解_手把手|20行Python代码教你批量将PDF文件转为Word格式(包教包会)...
  5. ic designer
  6. 能源利用率逼近理论极限 阿里巴巴展示液冷黑科技
  7. 桥梁模式 :Bridge(转自Terrylee)
  8. 浅谈“be practical and realistic”
  9. 进阶14 File类、遍历、递归
  10. hadoop2.X如何将namenode与SecondaryNameNode分开配置
  11. 安卓自定义列表dialog
  12. android手机 windows7,windows7手机版系统下载
  13. mysql根据15位或者18位身份证号计算年龄的自定义函数
  14. html5 3d动画效果代码,精选9款迷人的HTML5 3D动画效果及源码
  15. 老子,他有什么了不起
  16. OpenCV打开摄像头并显示图像(C++、Python)
  17. 如何搭建高德离线地图服务
  18. AsyncTask的优缺点
  19. 【RoCE】Flow Control
  20. 移动web-版心容器

热门文章

  1. c++学习笔记之模板
  2. kotlin中学习笔记——null
  3. 实现带header和footer功能的RecyclerView
  4. pygame外星人2
  5. EL表达式的作用与限制条件
  6. CSUOJ-1980 不堪重负的数(区间dp)
  7. Bootstrap学习之二:栅格化布局
  8. [zz]c++ list sort方法
  9. VC++ 删除当前读取行 代码
  10. asp网页设计流量统计代码