gpt4 book ai didi

java - 在可从主 Java 访问的静态方法内创建数组

转载 作者:行者123 更新时间:2023-12-02 11:42:35 25 4
gpt4 key购买 nike

这是我尝试在静态方法中创建数组的糟糕尝试。该程序的作用是列出具有特定扩展名的文档。我希望能够将它们存储在一个数组中并从 main 访问该数组。是否可以?这是我到目前为止的代码:

package recogniseKeywords;

import java.io.File;
import java.io.FileInputStream;
import java.util.Arrays;

import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

public class KeywordsRecognition {

public static void listFilesForFolder(final File folder) {

String[] files = {};
int fileSize = 0;

String[] extensions = {".doc", ".docm", ".xls"};

for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
listFilesForFolder(fileEntry);
} else {

for(int i=0; i<extensions.length; i++) {
//Check if contains one of the extensions and isn't a temporary file(~$)
if (fileEntry.getName().contains(extensions[i]) && !fileEntry.getName().startsWith("~$")) {
System.out.println(fileEntry.getName());
files[fileSize] = fileEntry.getName();
fileSize++;
}
}
}
}

}

public static void main(String[] args) throws Exception {

String[] keywords = {"Performance Enhancement", "Functional Specification", "Technical Specification", "Faults", "Arval", "Vehicle", "Fines", "Insurance"};


final File folder = new File("C:/work");
listFilesForFolder(folder);

System.out.println(Arrays.toString(files));

}
}
}

我知道这是一个静态方法,并且 int 以及数组不被视为非静态方法,但是,我不知道如何进一步进行。

最佳答案

我能给你的最好建议就是离开静态领域,进入实例领域,面向对象机会的领域!

在您的主要方法中执行以下操作:

public static void main(String[] args) throws Exception {    
KeywordsRecognition app = new KeywordsRecognition();
app.start();
}

然后实现 start 方法并在那里开始你的工作。这样做将为您的代码设计提供更多选择,使您能够编写更具可读性和可测试性的代码,从而减少错误和维护问题的代码。

要访问 listFilesForFolder 的结果,您可以返回它、将其分配给字段或将其添加到集合中。既然你是递归的,我会说:将它添加到集合中。

基本原理:每次递归都会添加到同一个集合中。您不希望中间结果对递归以外的其他代码可见,因此请避免使用字段并使用方法参数。此外,以这种方式通过递归传递数据很常见,因此其他开发人员会理解它。

private static final String ROOT_FOLDER_DEFAULT = "C:/work";
private static final String[] EXTENSIONS = {".doc", ".docm", ".xls"};
// TODO: the keywords are not used anywhere yet
private static final String[] KEYWORDS = {"Performance Enhancement", "Functional Specification", "Technical Specification", "Faults", "Arval", "Vehicle", "Fines", "Insurance"};

public void start(String rootFolder) {
List<String> files = new ArrayList<>();
readFilesRecursively(new File(rootFolder), files);
// trick to print list contents by converting to array
System.out.println(Arrays.toString(files.toArray()));
}

// recursion is not that common so when you use it,
// it's a good idea to clearly indicate this in the method name
public void readFilesRecursively(File folder, List<String> files) {
for (File file : folder.listFiles()) {
if (file.isDirectory()) {
readFilesRecursively(file, files);
} else {
for(String extension : EXTENSIONS) {
String fileName = file.getName();
if (fileName.contains(extension ) && !isTemporaryFile(fileName)) {
files.add(fileName);
}
}
}
}
}

// if you find yourself adding a comment in the middle of your code
// that usually means you need to extract a method for that bit
private boolean isTemporaryFile(String fileName) {
return fileName.startsWith("~$");
}

public static void main(String[] args) throws Exception {
KeywordsRecognition app = new KeywordsRecognition();
app.start(getRootFolder(args));
}

private static String getRootFolder(String[] args) {
if(args != null && args.length > 0) {
return args[0];
}
else {
return ROOT_FOLDER_DEFAULT:
}
}

旁注:你不能增加数组的大小;一旦你创建了它,它的大小就是固定的。因此,要么将数组初始化为正确的长度,要么使用 java.util.List 代替(可以选择在完全填充后将 List 转换为数组):

List<String> values = new ArrayList<>();
values.add("1");
values.add("foo");
values.add("elderberries");
String[] valuesAsArray = values.toArray();

要么,要么:

String[] valuesAsArray = new String[3];
values[0] = "1";
values[1] = "foo";
values[2] = "elderberries";

关于java - 在可从主 Java 访问的静态方法内创建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48439889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com