改进数组中的搜索

时间:2014-01-29 13:06:10

标签: java android

我是Android和Java的新手,所以请你好一点:)

我的应用程序中有一个EditText,用于搜索String[]

中的特定字符串

我的代码效果很好,但不是我想要的:

ArrayList<String> allProd = new ArrayList<String>;
ArrayList<String> allProd_sort = new ArrayList<String>;

allProd = [the table is brown, the cat is red, the dog is white];

String[] allProdString = allProd.toArray(new String[allProd.size()]);

...

 //inputSearch is the EditText
 inputSearch.addTextChangeListener (new TextWatcher() {

   ...

   @Override
   public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { 

     int textLength = inputSearch.getText().length();
     String text = inputSearch.getText().toString();

     for (int y = 0; y< allProdString.length; y++) {

        //in my case i want that the search start when there are min 3 characters in inputSearch
        if(textLength <= allProdString[y].length() && textLength >=3) {

           if (Pattern.compile(Pattern.quote(text), Pattern.CASE_INSENSITIVE)
                                .matcher(allProdString[y]).find()) {

               allProd_sort.add(allProdString[y]);

           }

        }
     }

   }

 });

此代码产生以下结果:

如果我搜索“table is”=&gt; allProd_sort将为[the table is brown]

但如果我搜索“table brown”=&gt; allProd_sort将为空,但我想要[the table is brown]

我该如何改进?

谢谢大家

2 个答案:

答案 0 :(得分:3)

您需要更改模式。目前,字符串需要包含您输入的内容。如果不是你放“table。* brown”的空格,它就会匹配。

您可以让用户输入正则表达式,或者您可以自己做一个简化的事情,在使用它来匹配之前,用“。*”替换查询字符串中的所有空格。

您可以在此处阅读有关正则表达式的所有内容:http://docs.oracle.com/javase/tutorial/essential/regex/

答案 1 :(得分:1)

好的 - 第一次优化:如果您的初始要求(Searchtext&gt; = 3)为真,则只进入循环:

@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {

  int textLength = inputSearch.getText().length();

  if (textLength < 3) return;

  String[] searchPattern = inputSearch.getText().toString().toLowerCase().split("\\s+");

  for (int y = 0; y< allProdString.length; y++) {

    if(textLength <= allProdString[y].length()) {
       if (matchSearch(allProdString[y].toLowerCase(), searchPattern)) {

           allProd_sort.add(allProdString[y]);

       }

    }
 }

如果您只想匹配行,其中所有单词都包含在相同的序列中,您可以简单地创建一个像Tim B所说的正则表达式。

但是,如果您还想匹配包含任何地方字词的字符串,请搜索“棕色表格” - &gt; [桌子是棕色的]然后你需要一个小循环:

public boolean matchSearch(String s, String[] searches) {
    for (String search : searches) {
        if (!s.contains(search) return false; // If the word is not in the string FALSE
    }
    return true; // If all words were found in the string, it is a match!
}

使这一点更清晰 - &gt;棕色。*表只会匹配表格来自棕色的字符串......我认为你不能轻易创建一个有效的RegEx来检查字符串中的每个单词是否至少有一次...