所以我有几个我使用大型CSV创建的数组和一些基本代码 - 没有问题。但我希望能够使用方法从CSV创建新数组,而不是仅仅复制和粘贴代码。这基本上就是我想做的事。
public static void makeArray(String name, String path, int rows, int columns){
//get CSV from path and make array with that data
}
但这是我现在所拥有的,而且它不起作用。
static String[][] makeArray(String name, String path, int rows, int columns) {
name = new String[rows][columns];
Scanner scanIn = null;
int r = 0;
String inputLine = "";
try {
System.out.println("Setting up " + name);
scanIn = new Scanner(new BufferedReader(new FileReader(path)));
while (scanIn.hasNextLine()) {
inputLine = scanIn.nextLine();
String[] inArray = inputLine.split(",");
for(int x = 0; x < inArray.length; x++) {
name[r][x] = inArray[x];
}
r++;
}
return name;
} catch(Exception e){
System.out.println(e);
}
}
我很感激帮助!!
答案 0 :(得分:1)
创建一个使用给定参数创建数组的方法吗?
您的代码存在的问题是,由于void
关键字以及您没有使用return
关键字,因此您未在方法中返回任何内容。
所以这就是你需要做的事情:
String[][]
。另一件事是你试图分配一个`String []
name = new String[rows][columns];
这将导致错误cannot convert String[][] to String
。
因此,在您的方法定义中,将name
的类型更改为String[][] name
,或者甚至更好地在方法中声明它,因为您正在方法中初始化它。
答案 1 :(得分:1)
您的代码存在以下问题:
Java是按值传递的,因此请删除name
参数并返回新创建的数组。
不要忽略异常。如果您不希望呼叫者必须处理IOException
,请抓住它并发送未经检查的例外。
使用try-with-resources确保Reader
正确关闭。
不要预先声明变量。在使用的地方声明它们。
对上述问题应用修补程序,您的代码将变为:
static String[][] makeArray(String path, int rows, int columns) {
String[][] name = new String[rows][columns];
try (Scanner scanIn = new Scanner(new BufferedReader(new FileReader(path)))) {
for (int r = 0; scanIn.hasNextLine(); r++) {
String inputLine = scanIn.nextLine();
String[] inArray = inputLine.split(",");
for (int x = 0; x < inArray.length; x++) {
name[r][x] = inArray[x];
}
}
} catch (IOException e) {
throw new IllegalArgumentException("Error reading file '" + path + "': " + e, e);
}
return name;
}
请注意,如果文件包含太多行,或者行包含太多值,则代码将失败。您可能想检查一下,或者让代码自行确定行数,例如:使用List
。
<强>更新强>
要自动创建包含文件中实际找到的行数的数组,可以使用以下代码。
代码还使用Arrays.copyOf()
方法确保每一行都是给定的列数。如果文件中的一行包含的值多于它,则会以静默方式丢弃它们。
static String[][] makeArray(String path, int columns) {
List<String[]> rows = new ArrayList<>();
try (Scanner in = new Scanner(new BufferedReader(new FileReader(path)))) {
while (in.hasNextLine()) {
String[] values = in.nextLine().split(",");
rows.add(Arrays.copyOf(values, columns)); // ignores excessive values
}
} catch (IOException e) {
throw new IllegalArgumentException("Error reading file '" + path + "': " + e, e);
}
return rows.toArray(new String[rows.size()][]);
}