2013-05-13 103 views
1

(我正在用android sdk开发,但可能并不重要) 我从文件中读取了几个短语并将它们保存在一个集合中。数据结构搜索短语中的单词

如: 的 “Hello World”, “你说你好”, “世界之大”

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

已经有这样做了吗? 这是最好的数据结构来老化这些数据?我正在考虑一个带有word和idPrase的MultiMap(例如:(“hello”,0),(“world”,0),(“you”,1),...) 我在想要得到一个sub -set(例如,如果用户键入“hello”,我将删除第三个短语)等等,以优化搜索。 (但也许是更好的从文件保存到sqlLite数据库而不是集合,我不知道...)

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

+0

这是你在找什么? http://developer.android.com/guide/topics/search/adding-custom-suggestions.html – Simon 2013-05-13 14:58:54

+0

似乎是这样!谢谢! – Accollativo 2013-05-13 19:36:29

回答

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否则,请为词组查询中的每个词找到返回的列表的联合。

+0

但是这个解决方案只在用户插入一个单词时才起作用,如果他插入两个或更多的单词怎么办? – Accollativo 2013-05-13 16:02:24

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 
      } 
     }); 

这里是little example with a listView

另一种方法也可以是使用custom suggestion