尝试从.data文件中获取值并将它们存储到int [] []数组中

时间:2014-04-05 19:01:52

标签: java arrays file java.util.scanner

我有一个.data文件,如下所示:

Data

我希望我的main方法能够读取文件并将其存储到二维int数组中,有一个“?”在数据中我希望它转换为0。

到目前为止我有这个代码,但它不起作用,我得到一个空指针异常(可能是从我的二维数组初始化为null)。问题是如果我没有将我的二维数组初始化为null它会给我错误编辑(这回答了问题的一部分,但我怎样才能让java得到数量的大小数据中的行然后将dataSet初始化为int [行数] [每行中的数字],我甚至不能让java首先读取文件)

public static void main(String[] args){

    int[][] dataSet = null;

    try {
        Scanner inFile = new Scanner(new File("C:\\Data Folder\\file.data"));

        while (inFile.hasNextInt()){
            for (int i = 0; i < dataSet.length; i++){
                for (int j = 0; j < dataSet[i].length;){
                    dataSet[i][j] = inFile.nextInt();
                }
                System.out.println(dataSet[i]);
            }

        }

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

我从来没有修改过Java上的文件,所以这对我来说都是新的。

感谢任何建议

编辑:下午3:11

所以我将我的二维数组改为数组列表,谢谢马苏德:

public static void main(String[] args){

    List<Integer> dataSet;

    try {
        Scanner inFile = new Scanner(new File("C:\\Data Folder\\file.data"));

        while (inFile.hasNextInt()){
            for (int i = 0; i < dataSet.size(); i++){
                dataSet.add(inFile.nextInt());
            }

        }

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Eclipse仍然要求我设置dataSet = null。如何从.data文件中获取每行中行数和数字的大小?

编辑:下午3:23

感谢Merlin实施Masud的建议,我已经更新了我的主要方法来代表你的代码,看它是否有效。我一直收到这个错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: "1 15943882 63 1 -9 -9 -9"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)

以下是我使用的代码:

public static void main(String[] args){

    List<int[]> dataSet = new ArrayList<int[]>();

    try {
        Scanner inFile = new Scanner(new File("C:\\Data Folder\\file.data"));

        while (inFile.hasNextLine()){
            String line = inFile.nextLine();
            String[] cols = line.split(",");
            int[] rows = new int[cols.length];
            for (int i = 0; i < cols.length; i++){
                if (!cols[i].equals("?")){
                    rows[i] = Integer.parseInt(cols[i]);
                }
                else {
                    rows[i] = 0;
                }
            }
            dataSet.add(rows);
            }
        System.out.println(dataSet.size());

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

它还告诉我在inFile中添加“@suppress warning”。

修改

我通过将文件路径更改为已处理的数据文件来修复错误,抱歉这是我的错。 Merlin和Masud感谢您的指导!

2 个答案:

答案 0 :(得分:2)

如果您的代码必须处理不同大小的数据,那么使用固定大小的数组并不是正确的答案。但是,您可以让Java为您确定列数。

List<int[]> dataSet = new ArrayList<int[]>();
while (inFile.hasNextLine()){
    String line = inFile.nextLine();
    String[] cols = line.split(",");
    int[] row = new int[cols.length];
    for (int i = 0; i < cols.length; i++)
        if (!cols[i].equals("?")) row[i] = Integer.parseInt(cols[i]);
        else row[i] = 0;
    dataSet.add(row);
}

答案 1 :(得分:0)

您已回答了您的问题。问题是dataSet为null因此是NullPointerException。您必须在使用

之前初始化它
int[][] dataSet = new int[size1][size2]

其中size1和size2是数组的已知大小。第二个问题是,在阅读文件之前你是否知道尺寸?首先,我将2维数组更改为列表列表,但也可以有更好的数据结构。