2014-11-02 91 views
0

在您推測類似「這個人要求幫助功課」之類的內容之前,我會繼續並澄清您可能會有的任何疑問,並說是,這與作業有關。但是,我希望這不會從這個問題提供給我和/或將來閱讀此內容的任何人的學習中消除。遞歸:檢查目錄中的文件並閱讀它們

背景:我們目前正在對遞歸和我們的作業要求,我們編寫使用命令參數來檢查目錄和一個字符串的文件內容(這也是一個命令參數)的程序。我們必須爲此使用遞歸。


- 我也想搞清楚的是我明白分配是ASKING 我只是問,如何將這項工作遞歸,因爲我只是不明白這一點。

我們遇到了一個問題,那就是我們必須找到一個目錄的大小,並且它是有道理的,但我不知道如何檢查某個目錄或文件是否是某個目錄或文件,並且基於該目錄我們讀取了其內容或更深入進入目錄直到我們找到一個文件。


這是我目前所做的。不太確定這是多麼的錯誤,因爲我完全不考慮我們以前做的'檢查目錄大小'作業:

我正在檢查的文件夾是這樣的: 目錄--- >文件--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如果你想深入一個導演(y/ies)?

回答

1

我會試試這個。這是比解釋更容易解釋的東西。

遞歸方法,在其上已經取得了不錯的開局,可能會被記錄如下:

「對於一個給定的目錄:在目錄中的每個文件,算上所有包含特定字符串的行;對於目錄中的每個目錄,遞歸「。

遞歸是可能的 - 而且很有用 - 因爲您的原始目標是一個容器,而它可以包含的其中一種類型是另一個容器。

所以覺得這樣的計數方式:

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從外部方法。

讓人們回想起遞歸的一件事是,在你寫完它之後,它似乎不可能完成它所做的一切。但通過上面的不同場景思考。如果傳入的目錄有文件且沒有目錄,則它將爲目錄中的每個文件累積countingLines,並返回結果。那就是你想要的。

如果目錄確實包含其他目錄,那麼對於其中的每個目錄,您將調用該例程並從包含目錄的目錄開始。該調用將爲該目錄中的每個文件累積countingLines,併爲樹中的每個dir遞歸調用其自身,直到它到達其中沒有dir的dir爲止。它仍然在這些線條中,它只是沒有任何進一步的遞歸。

在最低級別,它將積累這些行並返回它們。然後,第二個最低級別將得到總數增加到其總數,並開始返回行程備份遞歸樹。

這是否解釋它更好?

+0

這有點合理 - 早上試一下,因爲我從10月31號凌晨2點起牀,幾乎是我的睡覺時間。如果您仍然願意提供更多建議,我會回覆。再次感謝您提供有用的信息 - 明天早上回來。 – 2014-11-02 02:35:34

+0

想了一下之後,我無法真正理解你在這裏寫的東西 - 特別是'item'位。 'item'究竟是什麼,它是文件,但它是什麼?它是一個保存文件位置的變量,還是我在路徑中創建一個新文件?爲什麼 – 2014-11-02 05:47:38

+0

我試圖用循環的開始來定義這個:「對於目錄中的每個項目」。一個項目是目錄中的一件事,可以是(爲此目的)一個(數據)文件或另一個目錄。換句話說,它是一個變量,用於保存對數據文件或目錄的引用;循環遍歷作爲參數傳遞給方法的目錄中的每個這樣的項目。 (沒想到你回到這麼快......) – arcy 2014-11-02 12:38:09

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

我真的不想嘗試這個;我需要一個解釋而不是答案。如果我嘗試這一點,我只是有假的尤里卡時刻,因此答案就在我的臉上。謝謝,但不,謝謝。 – 2014-11-02 02:31:32

+0

在嘗試之前,您不會學習編寫遞歸函數。運行一次代碼。調試代碼。添加一些調試點。查看呼叫跟蹤。在紙上繪製流。之後,我相信你會有你的靈感時刻。 :) 相信我。 – jitsonfire 2014-11-02 02:36:21

+0

如果我不瞭解其功能的基礎,我該如何進行調試?我不知道程序中發生遞歸的地方 - 如果它是所有的,所以我不能真正添加​​它。 – 2014-11-02 05:49:29

相關問題