2013-02-19 2 views
2

Может кто-нибудь помочь мне с исправлением моей проблемы. У меня есть функция, которая проверяет, присутствует ли файл в определенном пути. функция проверяет, совпадают ли имена файлов, а также пути. (Файл с определенным именем может присутствовать в нескольких местах). Ниже вы найдете мой код.Оператор возврата не работает

memberPath - статическая переменная, которая содержит относительный путь. file_Path - статическая переменная, которая обновляется, когда совпадение найдено.

Моя проблема заключается в том, что функция находит совпадение, но она вырывается из цикла for, возвращается для возврата, но возвращается в цикл for. Может ли кто-нибудь помочь мне исправить мой код, чтобы после того, как совпадение найдено, он возвращает bac в вызывающую позицию.

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

Вот как проходит рекурсия. Чего вы ожидали? –

+2

Почему бы и нет, вместо того, чтобы нарушать, немедленно вернуться? –

+0

@RohitJain: но можете ли вы сказать мне, что я должен добавить, чтобы он вернулся к вызывающей позиции – user1688404

ответ

6

Добавить:

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

вернуть значение, которое вы получите от этого вызова.

Как указано - вы можете вернуть значение вместо перерыва.

+0

имеет значение u после file_Path = filePath; вместо перерыва; добавить обратный ход (f.getAbsolutePath(), имя файла); – user1688404

+0

Да. вместо того, чтобы перерыв просто вернуть filePath. Это не такая уж большая сделка, но она лучше, поскольку у вас уже есть ценность в руке, и вы можете ее вернуть. – BobTheBuilder

+0

вот так? public static String traverse (String path, String filename) { String filePath = null; Файл root = new Файл (путь); Файл [] list = root.listFiles(); для (Файл f: список) { if (f.isDirectory()) { traverse (f.getAbsolutePath(), имя файла); } else if (f.getName(). EqualsIgnoreCase (имя файла) ..) { filePath = f.getAbsolutePath(); file_Path = filePath; обратный ход (f.getAbsolutePath(), имя файла) ;; } } return filePath; } – user1688404

3

Как работает рекурсия, функция вызывает себя. Так что, когда ваша функция return s, он идет обратно в цикл, потому что, скорее всего, внешняя функция (тот, который назвал его) назвал его из приведенных ниже линий

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

Спасибо, ребята !!