2013-02-19 82 views
2

有人可以幫我解決我的問題。我有一個函數,用於檢查文件是否存在於特定路徑中。該函數檢查文件名是否匹配,路徑是否匹配(具有特定名稱的文件可能存在於多個位置)。請在下面找到我的代碼。退貨聲明不起作用

memberPath是一個包含相對路徑的靜態變量。 file_Path是一個靜態變量,當找到匹配項時它會被更新。

我的問題是該函數找到匹配,但它突然出現for循環返回語句,但回到for循環。有人可以幫助我修復我的代碼,以便一旦找到匹配,它將返回到呼叫位置。

public static String traverse(String path, String filename) { 
     String filePath = null; 
     File root = new File(path); 
     File[] list = root.listFiles(); 

     for (File f : list) { 
      if (f.isDirectory()) { 
       traverse(f.getAbsolutePath(), filename); 
      } else if (f.getName().equalsIgnoreCase(filename) && f.getAbsolutePath().endsWith(memberPath)) { 
       filePath = f.getAbsolutePath(); 
       file_Path = filePath; 
       break ; 
       } 
     } 
     return filePath; 
} 
+1

這就是遞歸。你期望會發生什麼? – 2013-02-19 08:34:14

+2

爲什麼不,而不是立即返回? – 2013-02-19 08:36:35

+0

@RohitJain:但是你能告訴我應該添加什麼,以便它返回到呼叫位置 – user1688404 2013-02-19 08:36:50

回答

6

地址:

return traverse(f.getAbsolutePath(), filename); 

回到你這個電話獲得的價值。

正如指出的那樣 - 您可以返回值而不是中斷。

+0

你是否指file_Path = filePath;而不是休息;添加返回遍歷(f.getAbsolutePath(),filename); – user1688404 2013-02-19 08:45:38

+0

是的。而不是打破只是返回filePath。這不是什麼大不了的事情,但是它更好,因爲您已經擁有了價值,並且可以將其退回。 – BobTheBuilder 2013-02-19 08:51:28

+0

是否這樣?公共靜態字符串遍歷(字符串路徑,字符串文件名){ String filePath = null; File root = new File(path); File [] list = root.listFiles(); (f.isDirectory()){ 遍歷(f.getAbsolutePath(),filename);如果(f.isDirectory()){ (f.getName()。equalsIgnoreCase(filename)..){ filePath = f.getAbsolutePath(); file_Path = filePath; 返回遍歷(f.getAbsolutePath(),filename);; } } return filePath; ( } – user1688404 2013-02-19 08:58:43

3

遞歸方式的工作方式是該函數自己調用。所以,當你的函數return S,它可以追溯到到for循環,因爲它很可能是外部函數調用它從下面的線

if (f.isDirectory()) { 
      traverse(f.getAbsolutePath(), filename); 

既然是這樣的話,你需要(調用它的一個)按照baraky的解釋在這裏添加返回值,否則你將失去內部函數派生的答案。

1

正如指出的baraky,KARTHIK和JanDvorak,更新的代碼是:

public String traverse(String path, String filename) { 
     String filePath = null; 
     File root = new File(path); 
     File[] list = root.listFiles(); 

     for (File f : list) { 
      if (f.isDirectory()) { 
       return traverse(f.getAbsolutePath(), filename); 
      } else if (f.getName().equalsIgnoreCase(filename) 
        && f.getAbsolutePath().endsWith(memberPath)) { 
       filePath = f.getAbsolutePath(); 
       file_Path = filePath; 
       return filePath; 

       } 
     }  
     return filePath; 
    } 

謝謝你們!