创建一个创建具有给定参数的数组的方法?

时间:2017-10-30 21:00:29

标签: java arrays string methods

所以我有几个我使用大型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);          
    }



}

我很感激帮助!!

2 个答案:

答案 0 :(得分:1)

  

创建一个使用给定参数创建数组的方法吗?

您的代码存在的问题是,由于void关键字以及您没有使用return关键字,因此您未在方法中返回任何内容。

所以这就是你需要做的事情:

  1. 首先,它的返回类型应为String[][]
  2. 其次,您应该在方法的最后返回已编辑的数组。
  3. 另一件事是你试图分配一个`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()][]);
}