2

我正在使用扫描仪读取文件。该文件被格式化,第一行是数组的维度。下一行包含第一行,下一行是第二行,依此类推。示例文件:

3 3
1 2 3
4 5 6
7 8 9

我一直遇到的问题是我的数组值似乎都是 9。文件是整数,但我需要双精度数。当我试图调试正在发生的事情时,我也有很多打印语句。我的异常处理还没有完成。在我可以正确地实例化数组之后,我会回去加强它。任何指针将不胜感激。例如:只需打开文件一次即可获取维度和实例化数组的更好方法。

更新但得到一个 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());
    }
4

5 回答 5

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());
}}

这应该根据需要将所有值存储为双倍,我认为这是从文件读取后存储的一种更简单的方法。

我想我的问题是正确的!

于 2013-09-09T05:34:01.653 回答
1

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

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

于 2013-09-09T05:23:04.203 回答
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;
}
于 2013-09-09T05:46:46.607 回答
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 给出的文件读取改进将显着改进此代码。虽然 using 是 java 7 和更高版本的唯一构造。对于早期版本。如果可以,请升级,否则请记住关闭资源。

于 2013-09-09T05:30:18.037 回答
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());
    }
}
于 2013-09-09T05:28:05.603 回答