0

我正在尝试学习如何编写实用程序类,但我不确定我正在尝试做的事情是否适合实用程序类。我对 java 还是很陌生,并试图从概念上理解如何以及何时做某些事情。

我有一个只有静态方法的类。而且我认为每当我的search()方法被递归调用时,它最初拥有的数据都会丢失。我的班级是这样设置的:

public class MyClassUtil {

    public static List<MyObjectData> findStuff(File path, List<String> listOfMyStuff) {
        String listAsString = convertListToString(listOfMyStuff);
        Pattern pattern = Pattern.compile(listAsString);

        List<MyObjectData> myObjectData = search(path, pattern);

        return myObjectData;
    }

    private static final String convertListToString(List<String> list) {

        // This method converts a given list to a string.  It works fine!
    }

    private static final List<MyObjectData> search(File directory, Pattern p) {

        List<MyObjectData> dataInFile = new ArrayList<MyStringData>();

        for (File file : directory.listFiles()) {
            if (file.isFile()) {
                try {
                    BufferedReader br = new BufferedReader(new FileReader(file));
                    String line;

                    while ((line = br.readLine()) != null) {
                        try {
                            Matcher m = p.matcher(line);
                            boolean found = m.find();

                            if (found) {
                                dataInFile.add(new MyObjectData(m.group(2), true));
                            }
                        } catch (Exception E) {
                            e.printStackTrace();
                        }
                    }
                    br.close();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
            if (file.isDirectory()) {
                search(file, p);
            }
            return dataInFile;
        }
    }
}

我没有得到任何回报(尽管我知道应该退还一些东西)。

4

2 回答 2

1

问题是您没有添加递归调用的结果。

改变:

     if(file.isDirectory()) { search(file, p); }

     if(file.isDirectory()) { dataInFile.addAll(search(file, p)); }
于 2013-09-03T11:11:49.693 回答
1

您可以让递归代码将文件添加到您传入的列表中。示例仅列出每个文件

private static void recursiveFill(List<File> files, File path) {
    if (path.isFile()) {
        files.add(path);
        return;
    }
    if (path.isDirectory()) {
        File[] innerFiles = path.listFiles();
        for (File file : innerFiles) {
            recursiveFill(files, file);
        }
    }
}

public static List<File> listFileIn(File path) {
    List<File> result = new ArrayList<File>();
    recursiveFill(result, path);
    return result;
}

public static void main(String[] args) {
    List<File> files = listFileIn(new File("."));
    for (File file : files) {
        System.out.println(file);
    }
}

你可以像以前那样做,但你必须使用返回值

if(file.isDirectory()) { search(file, p); }

并将这些结果合并到您返回的列表中。

于 2013-09-03T11:16:15.277 回答