我的应用中有一个活动,它接受一个搜索词并返回包含该搜索词的文件名。我正在尝试修改此代码,以便它可以拆分搜索词并显示包含任何搜索词的文件。例如,如果搜索词是"大狗"它将返回具有" big"的文件在标题和文件中包含" dog"在标题中。
代码的一部分是:
if (f.isDirectory()){
return true; // Don't discard any subdirectories
}
else {
String delimiter = " +"; /* delimiter */
searchname.searchname = searchname.searchname.toUpperCase();
//Split the search string
String [] tempname = searchname.searchname.split(delimiter);
//Array for the file names to be stored
boolean[] namestring = new boolean[tempname.length];
//Counter
int count;
count = 0;
for(int i=0; i<tempname.length; i++)
{
//While i is less than tempname size store filename to namestring array
namestring[i] = name.toUpperCase().contains(tempname[i]);
//Add one to count
count = +1;
//Once count = tempname length you can return all of the array values
if (count == tempname.length){
return namestring[i];
}
}
}
return false;
我的java很基本,我可能会遗漏一些非常明显的东西。
非常感谢您的帮助
感谢大家的快速回复。
我想我明白你们所说的话。我修改了我的代码以显示:
public boolean accept(File dir, String name) {
File f = new File(dir, name); // Form the file path "dir/name".
String delimiter = " "; /* delimiter */
searchname.searchname = searchname.searchname.toUpperCase();
//Split the search string//
String [] tempname = searchname.searchname.split(delimiter);
//Array of Booleans
ArrayList<Boolean> matches = new ArrayList<Boolean>();
if (f.isDirectory()){
return true; // Don't discard any subdirectories
}
else {
for(int i=0; i<tempname.length; i++)
{
// Toast.makeText(getApplicationContext(), (tempname[i]), Toast.LENGTH_SHORT).show();
matches.add(name.toUpperCase().contains(tempname[i]));
}
}
return matches;
}});
然而,在Eclipse中它显示&#34;返回匹配;&#34;作为错误&#34;类型不匹配:无法从ArrayList转换为boolean&#34;。如果我进行了建议的更改,它会在&#34;公共布尔接受(文件目录,字符串名称)上放置错误{&#34;部分。有什么建议?
答案 0 :(得分:4)
你遗漏的一件事是
count = +1;
在你的for循环中。它应该是
cout++;
或
cout = count+1;
答案 1 :(得分:0)
请注意,return namestring[i]
仅返回一个值(并且不会提到所提到的值)。要返回所有需要的数组值,请将方法声明为返回数组,然后返回数组namestring
,即
public boolean[] yourMethod()
{
boolean[] namestring = ....
//Your code
return namestring;
}
我认为你应该使用List
作为返回类型,在你的方法中实现一个Arraylist
的字符串(如果你愿意,可以使用布尔值)。这样做的好处是你可以使用动态大小,即如果你的搜索词是"Big dog"
,你有20个文件,其中5个匹配,你创建的数组只有2个元素,所以只会返回2个文件名。如果您以列表形式执行此操作,则会在您添加更多内容时动态增长。
To Inistialise:
List<String> matches = new ArrayList<String>();
然后当您在循环中找到匹配项(伪代码)时:
//For each file name
// For each search term
// If name contains search term
// Add to list
matches.add(name) // Actual code to add to list.
然后返回列表
return matches;
答案 2 :(得分:0)
注释:
答案 3 :(得分:0)
该函数应按其定义返回boolean: public boolean accept(File dir,String name) 但是你返回ArrayList。
这可能是你想要的:
public boolean accept(File dir, String name) {
File f = new File(dir, name); // Form the file path "dir/name".
String delimiter = " "; /* delimiter */
searchname.searchname = searchname.searchname.toUpperCase();
//Split the search string//
String [] tempname = searchname.searchname.split(delimiter);
if (f.isDirectory()){
return true; // Don't discard any subdirectories
} else {
for(int i=0; i<tempname.length; i++){
// Toast.makeText(getApplicationContext(), (tempname[i]), Toast.LENGTH_SHORT).show();
if(name.toUpperCase().contains(tempname[i])) {
return true;
}
}
}
return false;
}