递归堆栈不保存散列映射

时间:2015-12-03 23:35:02

标签: java recursion hashmap iteration file-handling

我的代码如下

public class FileHandler {

public static void main(String... args) {
    File file = new File("C:/Users/TJF22/Desktop/Simple Network 1/alpha 15");
    mapFiles(file);
}

public static HashMap<String,File[]> mapFiles(File directory){
    File[] inputContents = directory.listFiles();
    HashMap<String,File[]> fileMap= new HashMap<String,File[]>();
    for (File content : inputContents){
        if (content.isDirectory()){
            File[] nestedContents = content.listFiles();
            if (areAllFiles(nestedContents)){
                String key = content.getPath();
                fileMap.put(key,nestedContents);
            } else {
                mapFiles(content);
            }
        }
    }
    return fileMap;
}

public static boolean areAllFiles(File[] directory){
    for (File files : directory){
        if (!files.isFile()){
            return false;
        }
    }
    return true;
}

我想要的是能够以递归方式遍历给定的输入文件目录以及此输入目录中包含的文件:

- 如果文件是一个目录,所有这些目录内容都是文件,那么将目录名作为键关联到其中的文件名(作为值)并存储到fileMap

- 如果文件是一个目录并且其中包含其他目录,那么继续操作直到找到其中只有文件的目录

- 如果文件是文件,则忽略它

但我的问题是当我返回文件映射,HashMap时,我得到一个空的HashMap,因为由于某种原因,我存储的键,值对没有被保存。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

每次重新调用mapFiles时,您需要跟踪现有的HashMap,而不是重新创建地图。

public static HashMap<String,File[]> mapFiles(File directory){
    HashMap<String,File[]> fileMap = new HashMap<String,File[]>();
    fileMap = mapFiles_Recursive(directory, fileMap);
    return fileMap;
}


private static HashMap<String,File[]> mapFiles_Recursive(File directory, HashMap<String,File[]> fileMap) {
    File[] inputContents = directory.listFiles();
    for (File content : inputContents){
        if (content.isDirectory()){
            File[] nestedContents = content.listFiles();
            if (areAllFiles(nestedContents)){
                String key = content.getPath();
                fileMap.put(key,nestedContents);
            } else {
                mapFiles(content, fileMap);
            }
        }
    }
    return fileMap;
}