我试图学习如何编写实用程序类,而且我不确定我尝试做的是否是实用程序类的一个很好的候选者。我对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;
}
}
}
我没有得到任何回报(虽然我知道应该退回一些东西)。
答案 0 :(得分:1)
问题是你没有添加递归调用的结果。
更改:
if(file.isDirectory()) { search(file, p); }
到
if(file.isDirectory()) { dataInFile.addAll(search(file, p)); }
答案 1 :(得分: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); }
并将这些结果合并到您返回的列表中。