您的位置:首页 > 其它

词语搜索算法思想 - 第二步 算法思想

2012-02-24 23:36 211 查看
接下来我们来分析这个问题,解决这个问题最核心的思想是,我们要准备一个用户输入的字符和版块对应结构:

key=“天”,value=[“情感天地”、“天涯杂谈”]

key=“娱乐”, value=[ “娱乐八卦”]

key=“t”,value=[“情感天地”、“天涯杂谈”,“贴图专区”,“经济论坛”,“股市论谈”]

key=“ty”, value=[ “天涯杂谈”]

key=“ylbg”, value=[ “娱乐八卦”]

使用一个Map<String, String[]>即可。

有了上面的思路,我们的重点就在于,怎样建立以上这个结构?

换一个角度考虑,我们怎样获得所有的key?

我们来看下现在有点数据:

版块名:娱乐八卦 情感天地 天涯杂谈 贴图专区 国际观察 经济论坛 时尚资讯 莲蓬鬼话 股市论谈 煮酒论史 开心乐园

现在要做到是,把“娱乐八卦”切割成“娱、乐、八、卦、娱乐、八卦、y、l、b、g、yl、bg、ylbg、yu、le、ba、gua、yule、bagua...”。 切割成key的同时,把“娱乐八卦”当作所有这些key的value的一个,那么结构就有了。

我们先实现第一步,切割词语:

package test;

import java.util.ArrayList;
import java.util.Arrays;

public class Test {

public static void main(String[] args) {
System.out.println(Arrays.toString(split("娱乐八卦")));
System.out.println(Arrays.toString(split("ylbg")));
System.out.println(Arrays.toString(split("yulebagua")));
}

/**
* 切割词语
*/
public static String[] split(String s) {
int len = s.length();
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < len; i++)
for (int j = i + 1; j <= len; j++)
list.add(s.substring(i, j));
return list.toArray(new String[list.size()]);
}
}


输出结果:

[娱, 娱乐, 娱乐八, 娱乐八卦, 乐, 乐八, 乐八卦, 八, 八卦, 卦]
[y, yl, ylb, ylbg, l, lb, lbg, b, bg, g]
[y, yu, yul, yule, yuleb, yuleba, yulebag, yulebagu, yulebagua, u, ul, ule, uleb, uleba, ulebag, ulebagu, ulebagua, l, le, leb, leba, lebag, lebagu, lebagua, e, eb, eba, ebag, ebagu, ebagua, b, ba, bag, bagu, bagua, a, ag, agu, agua, g, gu, gua, u, ua, a]


第一组、第二组数据可以,第三组数据不理想,比如“u、ul、ule,uleb”等,问题在于拼音搜索中,还是以首个字母为主。

于是进行优化:

package test;

import java.util.ArrayList;
import java.util.Arrays;

public class Test {

public static void main(String[] args) {
System.out.println(Arrays.toString(split("娱乐八卦")));
System.out.println(Arrays.toString(split("ylbg")));
System.out.println(Arrays.toString(split("yu,le,ba,gua")));
}

/**
* 切割词语
*/
public static String[] split(String s) {
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 (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()]);
}

}


输出结果:

[娱, 娱乐, 娱乐八, 娱乐八卦]
[y, yl, ylb, ylbg]
[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]


:)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: