我是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]
我该如何改进?
谢谢大家
答案 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来检查字符串中的每个单词是否至少有一次...