1

(我正在使用 android sdk 进行开发,但也许这并不重要)我从一个文件中读取了几个短语并将它们保存在一个集合中。

例如:“hello world”、“you say hello”、“big world”

我想做类似谷歌主页的东西。我有一个编辑文本,用户可以在其中写一个或多个单词。当他键入第一个单词(例如:“hello”)时,我想在一些文本字段中显示可能的候选短语(例如:“hello world”、“mark say hello”)。现在用户可以输入另一个词来细化搜索等等。

已经有东西可以做到这一点?哪个是旧数据的最佳数据结构?我在考虑一个带有 word 和 idPhrase 的 MultiMap(例如:(“hello”,0),(“world”,0),(“you”,1),...)我想得到一个子集(例如,如果用户键入“hello”,我将删除第三个短语)等等,以优化搜索。(但也许将短语从文件保存到 sqlLite DB 而不是集合更好,我不知道......)

存在更好的方法来做到这一点?

4

2 回答 2

0

倒排索引是正确的数据结构。不确定网络上的某个地方是否有它的实现(肯定有),但自己构建它很容易。看看这里:

http://en.wikipedia.org/wiki/Inverted_index

算法应该是这样的:

for(String phrase : phrases)  
{     
    for(String word : phrase.split(" "))  
    {  
        List temp= map.get(word); 
        if (temp == null) {
            temp= new ArrayList<String>();
            map.put(word, temp);
        }
        temp.add(phrase);
    }  
}  

稍后,您只需在地图上查询用户查询(一个词)并打印短语列表。

如果您需要短语搜索,您可能需要查看:http ://en.wikipedia.org/wiki/Tf –idf 否则,查找为短语查询中的每个单词返回的列表的并集。

于 2013-05-13T15:00:34.760 回答
0

然后,您正在寻找 TextWatcher。

myEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

                // TODO Auto-generated method stub
                //Here implemens the logic stuff that at each new character entered

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                // TODO Auto-generated method stub
            }

            @Override
            public void afterTextChanged(Editable s) {

                // TODO Auto-generated method stub
            }
        });

这是一个 listView 的小例子

另一种方法也可以是使用自定义建议

于 2013-05-13T15:01:05.250 回答