2014-11-02 1 views
0

"이 사람은 숙제를 요청합니다."와 같은 것을 추측하기 전에 내가 가질 수있는 의구심을 제거하고 예라고 대답합니다. 이는 숙제와 관련이 있습니다. 그러나이 질문이 저에게 제공하는 학습 및/또는 앞으로 이것을 읽는 모든 사람을 포기하지 않기를 바랍니다.재귀 : 디렉토리의 파일 확인 및 읽기

배경 : 우리는 현재 재귀 작업을하고 있습니다. 우리는 명령 인수를 사용하여 디렉토리와 파일 내용에 문자열 (명령 인수이기도 함)을 검사하는 프로그램을 작성하라고합니다. 우리는 재귀를 사용해야합니다.


- 난 내가 할당이 단순히 요구하고 을 요구하고 이해하는 것이이 명확하게하려면 어떻게 그냥 이해가 안가 재귀이 일 때문에.

우리는 디렉토리의 크기를 찾아야 만하는 것이 문제가되었지만 뭔가가 디렉토리인지 파일인지를 확인하는 방법을 모르고 그 내용을 읽거나 더 깊이 간다. 우리가 파일을 찾을 때까지 디렉토리에.


다음은 현재 수행 한 작업입니다. 정확히 내가 디렉토리의 할당을 확인했기 때문에 이것이 얼마나 잘못되었는지는 알지 못한다.

확인할 폴더는 다음과 같다 : 디렉토리 --- > 파일은 주 디렉토리 --- >>를 --inside 해당 디렉토리 모두

공용 클래스 SearchingForStrings {

public static void main(String[] args) { 
    String path = "."; // default location of this project 
    File sf = new File(path); 
    String mysteriesDirectory = args[0]; 
    String keyString = args[1]; 

    countLinesWithString(sf, mysteriesDirectory, keyString); 
} 

public static int countLinesWithString(File startPath, String mysteriesDirectory, String keyString) { 
    if(!startPath.exists()) { 
     throw new IllegalArgumentException("File " + startPath + " does not exist!"); 
    } else if(startPath.isFile()) { 
     return Integer.parseInt(startPath.getAbsolutePath()); // Just to show where the file is I located the parsing is just to stop an error from flagging on this part; Going to ask professor if it's okay with him 


     // this is where we would begin reading the contents of the files 
    } else if(startPath.isDirectory()) { 
     // This is where our recursion would take place: essentially 
     // we will be going 'deeper' into the directory until we find a file 

     //File[] subFiles = startPath.listFiles(); 
     countLinesWithString(startPath, mysteriesDirectory, keyString); 
    } else { 
     throw new IllegalStateException("Unknown file type: " + startPath); 
    } 

} 

} 한마디로

내에서 두 디렉토리 ----> 파일 : 누군가가 수 재귀가 얼마나 좋을지 설명하십시오. 당신이 더 깊은 감독으로 가고 싶다면 k?

답변

1

나는 이것을 시도 할 것이다. 이해하기보다는 설명하기가 더 쉬운 것입니다. 주어진 디렉토리를 들어

을 "다음과 같이

당신이 괜찮은 출발을했다하는 재귀 방법은 문서화 할 수있는 디렉토리에있는 각 파일에 대해, 특정 문자열을 포함하는 모든 라인을 계산; 디렉토리의 각 디렉토리에 대해 recurse. "

원래 대상이 컨테이너이고 포함 할 수있는 유형 중 하나가 다른 컨테이너이므로 재귀가 가능하고 유용합니다.

그래서이 같은 계산 방법을 생각 :

int countLines(dir, string) // the string could be an instance variable, also, and not passed in 
{ 
    var countedLines = 0; 
    for each item in dir: 
    if item is file, countedLines += matchedLinesInFile(item, string); 
    else if item is dir, countedLines += countLines(item, string); 
    else throw up; // or throw an exception -- your choice 
} 

다음 사용하는 원래의 디렉토리, 플러스 문자열로 외부 방법에서 countLines를 호출합니다.

재귀에 대해 사람들을 떠나는 것 중 하나는 작성된 후에는 그것이 할 수있는 모든 일을 할 수 없다는 것입니다. 그러나 여러 가지 시나리오에 대해 위를 생각하십시오. dir이 전달 된 파일과 dir이 없으면 dir의 각 파일에 대해 countedLines를 누적하여 결과를 반환합니다. 그것이 당신이 원하는 것입니다.

dir에 다른 dir이 있으면 해당 dir을 포함하여 각 dir에 대해 루틴을 호출하고 포함 된 dir에서 시작합니다. 호출은 해당 dir의 각 파일에 대해 countedLines를 누적하고 dir이없는 dir에 도달 할 때까지 트리마다 재귀 적으로 각 dir을 호출합니다. 그리고 그것들은 아직도 그것들의 줄을 세우고, 그것은 단지 더 이상 반복적으로 발생하지 않습니다.

가장 낮은 레벨에서이 라인을 누적하여 리턴합니다. 그런 다음 두 번째로 낮은 수준에서 총계에 합계를 더하여 재귀 트리를 백업하는 리턴 트립을 시작합니다.

더 나은 설명이 있습니까?

+0

이것은 다소 의미가 있습니다 - 오전 2시 10 월 31 일과 그 거의 나의 침대 시간부터 올라가고 있기 때문에 나는 아침에 그것을 시도 할 것입니다. 당신이 여전히 더 많은 조언을 기꺼이 원한다면 나는 대답 할 것이다. 도움이되는 의견을 보내 주셔서 다시 한 번 감사드립니다. 내일 아침에 다시 오십시오. –

+0

조금 생각한 후에, 나는 당신이 여기서 쓴 것을 정말로 이해할 수 없다. 정확히 '항목'은 파일이라는 것을 알지만 그게 무엇입니까? 파일의 위치를 ​​유지하는 변수입니까, 아니면 경로에 새 파일을 만드시겠습니까? 왜 –

+0

루프의 시작과 함께 이것을 "dir의 각 항목에 대해"정의하려고했습니다. 항목은 디렉토리의 한 가지 항목으로, (데이터) 파일 또는 다른 디렉토리 중 하나 일 수 있습니다. 즉, 데이터 파일이나 디렉토리에 대한 참조를 보유하는 변수입니다. 루프는 메소드의 매개 변수로 전달 된 디렉토리의 모든 항목을 통과합니다. (이렇게 곧 돌아올 것으로 기대하지 않았다 ...) – arcy

1

재귀를 시작하는 데 도움이됩니다. 모든 폴더와 파일을 인쇄하는 기본 디렉토리에서 재귀 적으로 이동합니다. 요구 사항에 맞게 수정하십시오. 시도해보고 알려주십시오.

import java.io.File; 

public class Test { 


    public static void getResource(final String resourcePath) { 

     File file = new File(resourcePath); 
     if (file.isFile()) { 
      System.out.println("File Name : " + file.getName()); 
      return; 
     } else { 
      File[] listFiles = file.listFiles(); 
      if (listFiles != null) { 
       for (File resourceInDirectory : listFiles) { 

        if (!resourceInDirectory.isFile()) { 
         System.out.println("Folder " 
           + resourceInDirectory.getAbsolutePath()); 
         getResource(resourceInDirectory.getAbsolutePath()); 
        } else { 
         getResource(resourceInDirectory.getAbsolutePath()); 
        } 

       } 
      } 

     } 
    } 

    public static void main(String[] args) { 

     final String folderPath = "C:/Test"; 
     getResource(folderPath); 
    } 

} 
+0

나는 솔직히 이것을 시도하고 싶지 않다; 나는 대답이 아니라 설명이 필요하다. 이걸 시도하면 거짓말을하는 유레카 순간이 내 얼굴에 쑤셔 넣어집니다. 고마워하지만 고맙다. –

+0

시도 할 때까지 재귀 함수를 작성하는 법을 배우지 않습니다. 코드를 한 번 실행하십시오. 코드를 디버그하십시오. 몇 가지 디버그 포인트를 추가하십시오. 전화 추적을 참조하십시오. 종이에 흐름을 그립니다. 그 후에 나는 네가 네 유레카의 순간을 가질 것이라고 확신한다. :) 날 믿어. – jitsonfire

+0

기능의 기초를 이해하지 못하면 어떻게 디버깅합니까? 프로그램에서 재귀가 어디에서 일어나고 있는지 알 수 없습니다. 전혀 없다면 실제로 추가 할 수 없습니다. –

관련 문제