从循环返回多个数组值

时间:2013-08-23 01:43:42

标签: java android arrays for-loop return

我的应用中有一个活动,它接受一个搜索词并返回包含该搜索词的文件名。我正在尝试修改此代码,以便它可以拆分搜索词并显示包含任何搜索词的文件。例如,如果搜索词是"大狗"它将返回具有" 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;部分。有什么建议?

4 个答案:

答案 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)

注释:

  1. count = +1应为count + = 1
  2. 如果你想在循环结束后返回,你不需要计数,只需将返回句子放在外面循环
  3. 您希望在评论中返回数组,但只返回一个布尔值,并始终返回最后一个
  4. 似乎你不需要返回数组,因为你只需要确定文件名是否包含任何一个术语,当文件名包含任何split数组时,你可以返回true。
  5. 你的代码使用“+”作为分隔符,但你提到“大狗”作为例子,其分隔符为“”
  6. 尝试使用此调试进行故障排除或记录以分析哪个部分无法正常工作

答案 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;  
}