2d数组的构造函数仅包含最后一个值

时间:2013-09-09 05:16:09

标签: java arrays file-upload multidimensional-array

我正在使用扫描仪阅读文件。格式化文件,第一行是数组的维度。下一行包含第一行,下一行包含第二行,等等。示例文件:

3 3
1 2 3 
4 5 6
7 8 9

我一直遇到的问题是我的数组值似乎都是9.文件是ints但是我需要它们在双打中。我在那里也有很多打印语句,因为我正在尝试调试正在进行的操作。我的异常处理尚未完成。在我可以正确实例化数组后,我会回过头来加强它。任何指针将不胜感激。例如:只需打开文件一次就可以获得维度和实例化数组的更好方法。

已更新但获取nullPointerException

public class Help implements TopoMapInterface {

private String filename;
private File mapfile;
public double[][] baseMap;
public double[][] enMap;
public int enhancementLevel;

public Help(String filename) throws FileNotFoundException,
        InvalidFileFormatException {
    this.filename = filename;

    System.out.println("Reading in file: " + filename);

    String number = "";
    int row = 0;
    int col = 0;
    int count = 0;

    try {
        Scanner inputFile = new Scanner(new File(filename));

        while (inputFile.hasNextInt()) {
            row = Integer.parseInt(inputFile.next());
            col = Integer.parseInt(inputFile.next());
            System.out.println("Row : " + row);
            System.out.println("Col : " + col);
            baseMap = new double[row][col];
            System.out.println(baseMap[2][4]);
            for (int i = 0; i < baseMap.length; i++){
                for (int j = 0; j < baseMap[i].length; j++){
                    baseMap[i][j] = Double.parseDouble(inputFile.next());
                }
            }
        }
    } catch (Exception e) {
        System.out.println(e.toString());
    }

5 个答案:

答案 0 :(得分:2)

假设您的第一行的值先行为行,然后是列

我会这样做

int row = Double.parseDouble(inputFile.next());
int col = Double.parseDouble(inputFile.next());


for (int i = 0;i<row;i++){
for(j=0;j<col;j++)
{
baseMap[i][j]=Double.parseDouble(inputFile.next());
}}

这应该根据需要将所有值存储为double,我认为这是从文件读取后更容易存储的方法。

我想我的问题是正确的!

答案 1 :(得分:1)

每次在count1 > 2读取数字时,您都会迭代整个矩阵并将doubleVal插入每个单元格;你看到的最后一个值是9,所以这就是你到处都有的。

更一般地说,如果你保证有正确的输入(即,你有像这样的学校练习),那么你不应该在循环中阅读你的尺寸规格;您应该阅读前两个int,根据该大小创建数组,然后使用嵌套的for循环将值插入到数组中。

答案 2 :(得分:0)

首先使用scanner或任何其他流时,最后应使用finally语句关闭它们

Scanner inputFile = null;

try{
  inputFile = new Scanner(new File(filename));
}
catch{}
finally{
   if(inputFile != null)
      inputFile.close();
}

这将确保您在完成阅读时释放扫描仪,而不是将其保持到下一个循环。

另外,在您的代码中,在第二个while循环中,您似乎没有正确关闭它,因此在每个循环中都会调用此代码:

    if (count1 > 2){
        for (int r = 0; r < baseMap.length; r++){
            for (int c = 0; c < baseMap[r].length; c++){

            baseMap[r][c] = doubleVal;
        }
    }  

最后一件事,你打开文件两次!没有必要这样做。至少您可以将代码更改为:

public class Help implements TopoMapInterface {

private String filename;
private File mapfile;
public double[][] baseMap;
public double[][] enMap;
public int enhancementLevel;

public Help(String filename) throws FileNotFoundException,
        InvalidFileFormatException {
    this.filename = filename;

    System.out.println("Reading in file: " + filename);

    String number = "";
    int row = 0;
    int col = 0;
    int count = 0;
    Scanner inputFile = null;

    try {
        inputFile = new Scanner(new File(filename));
            number = inputFile.next();
            System.out.println(number);
            row = Integer.parseInt(number);
            number = inputFile.next();
            col = Integer.parseInt(number);
            int count1 = 0;
            baseMap = new double[row][col];
            while (inputFile.hasNextInt()) {
                count1++;
                number = inputFile.next();
                int intVal = Integer.parseInt(number);
                double doubleVal = (double) intVal;
            }// Closed your while loop here

            if (count1 > 2){
                for (int r = 0; r < baseMap.length; r++){
                    for (int c = 0; c < baseMap[r].length; c++){

                    baseMap[r][c] = doubleVal;
                }
            }   
            System.out.println(doubleVal+"*");
            }   

        }
        System.out.println("end of this while loop");
    } catch (Exception e) {
        System.out.println(e.toString());
    }
    finally
    {
        if(inputFile != null)
           inputFile.close();
    }

    try {
        System.out.println("Row = " + row + "  Col = " + col);
        for (int r = 0; r < baseMap.length; r++) {
            for (int c = 0; c < baseMap[r].length; c++) {
                System.out.print(baseMap[r][c] + " ");
            }
        }

    } catch (Exception e) {
        System.out.println(e.toString());
    }
}

答案 3 :(得分:0)

for (int r = 0; r < baseMap.length; r++){
    for (int c = 0; c < baseMap[r].length; c++){
        baseMap[r][c] = doubleVal;
    }
}

是问题所在。 这将遍历数组的每一行和每一行,将每个元素设置为当前数字 因为你看到的最后一个数字是9,那就是数组中剩下的数字。

您真正需要的是跟踪行数和列数的其他方法,而不是遍历数组。也许是一对柜台?

int intVal = Integer.parseInt(number);
double doubleVal = (double) intVal;

应该替换为     double doubleVal = Double.parseDouble(number);

文件阅读改进,由No Idea For Name给出 会显着改善这段代码。虽然使用的是java 7及以后的唯一构造。 对于早期版本。如果可以升级,请记得关闭资源。

答案 4 :(得分:0)

我不确定你为什么要扫描文件两次,但如果你在这里就是代码中的问题

for (int r = 0; r < baseMap.length; r++){
    for (int c = 0; c < baseMap[r].length; c++){
        baseMap[r][c] = doubleVal;
    }
}

以下代码将解决您的问题:

try {
        Scanner inputFile = new Scanner(new File(filename));
        int count1 = 0;
        int r = -1, c = -1;
        baseMap = new double[row][col];
        while (inputFile.hasNextInt()) {
            count1++;
            number = inputFile.next();
            int intVal = Integer.parseInt(number);
            double doubleVal = (double) intVal;


            if (count1 > 2){
                if (count1 % row == 0)
                    r++;
                c = count1 % col;
                baseMap[r][c] = doubleVal;


            System.out.println(doubleVal+"*");
            }   
        }

        inputFile.close();

        System.out.println("Row = " + row + "  Col = " + col);
        for (r = 0; r < baseMap.length; r++) {
            for (c = 0; c < baseMap[r].length; c++) {
                System.out.print(baseMap[r][c] + " ");
            }
        }

    } catch (Exception e) {
        System.out.println(e.toString());
    }

另外,不要忘记在第一次扫描中休息一下

if (count == 1) {
     row = Integer.parseInt(number);
} else if (count == 2) {
     col = Integer.parseInt(number);
     break;
}