【问题标题】:ArrayStoreException When Converting from list of 1D arrays to 2D array从一维数组列表转换为二维数组时出现 ArrayStoreException
【发布时间】:2016-11-21 14:31:32
【问题描述】:

我使用以下方法收到 java.lang.ArrayStoreException 错误:

public static int[][] getData(String path) throws IOException
    {
        // Read all
        CSVReader csvReader = new CSVReader(new FileReader(new File(path)));
        List<String []> list = csvReader.readAll();
        csvReader.close();

        // Convert to 2D array
        int[][] dataArr=list.toArray(new int[list.size()][]);

        for(int i = 0; i<3; i++)
        {
            for(int x = 0; x<3; x++)
            {


System.out.print(dataArr[i][x]);
        }
        System.out.println();
    }
    return dataArr;
}

它引用了“//转换为二维数组”下的行作为问题,我尝试了在其他问题中看到的各种方法来完成这项工作,但无济于事! 代码引用 path 中的 CSV 文件,然后用值填充二维数组。如果有比使用任何人都知道的 CSVReader 更简单的方法,我很乐意看到它!我在这里找到了这段代码,我也看过其他几篇关于它的帖子,但这似乎是最简单的,我不认为它会导致问题。

非常感谢。

【问题讨论】:

  • 一个简单的印刷错误。
  • @JonnyHenly 既然这么简单,何不给个建设性的答复?
  • @avojak OP 将如何从我重申 3 个答案已经说过的内容中受益?更不用说multiple related questions 已经有了总结下面所说的答案。我并不是以否定的方式表示简单,我只是添加了一条评论,其中包含我提出的关闭标志。

标签: java arrays 2d converter


【解决方案1】:

您应该将您的字符串列表转换为字符串[][]:

// Convert to 2D array
String[][] dataArr=list.toArray(new String[0][0]);

【讨论】:

  • 如果 OP 需要代码所示的 int[][] 而不是您建议的 String[][] 怎么办?
  • 然后他必须以某种方式将 String[] 转换为 int[] : list.stream().map(stringArray -> createIntArrayFromString(stringArray));
【解决方案2】:

注意.toArray() 方法的文档:

ThrowsArrayStoreException - 如果指定数组的运行时类型不是 此列表中每个元素的运行时类型

在您的情况下,指定数组的类型为int[],这不是列表中每个元素的类型的超类型,即String[]

修复方法取决于您需要的数组类型。如果您需要来自字符串的int[][],则需要迭代并构建int[][]。如果String[][] 就足够了,那么您可以改为为.toArray() 方法提供一个新的String[][]

【讨论】:

    【解决方案3】:

    随行:

    int[][] dataArr=list.toArray(new int[list.size()][]);
    

    您正在尝试将String[] 存储在int[][] 中,这是不允许的。而且由于数组在运行时会检查其组件的类型,因此会出现异常。


    如果您想将List&lt;String[]&gt; 转换为int[][],您将不得不手动进行:

    int[][] dataArr = new int[list.size()][];
    
    for(int i = 0; i < list.size(); i++) {
        dataArr[i] = new int[list.get(i).length];
        for(int j = 0; j < dataArr[i].length; j++) {
            dataArr[i][j] = Integer.parseInt(list.get(i)[j]);
        }
    }
    

    【讨论】:

    • 我现在在 'dataArr[i][j] = Integer.parseInt(list.get(i)[j]);' 中遇到一个新错误,数字格式异常行。
    • @WilliamJestes 这意味着您的输入字符串不是有效的Integer。例如如果字符串是"not a number" 而不是"15",则会发生此异常。
    • 感谢您的初步回复,我意识到输入文件包含字符串,我不应该尝试创建整数双精度数组。
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2016-02-18
    • 2018-02-19
    • 2015-09-03
    相关资源
    最近更新 更多