Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二维数组的构造函数仅包含最后一个值_Java_Arrays_File Upload_Multidimensional Array - Fatal编程技术网

Java 二维数组的构造函数仅包含最后一个值

Java 二维数组的构造函数仅包含最后一个值,java,arrays,file-upload,multidimensional-array,Java,Arrays,File Upload,Multidimensional Array,我正在用扫描仪读取文件。文件的格式为第一行是数组的维度。下一行包含第一行,下一行包含第二行,等等。示例文件: 3 3 1 2 3 4 5 6 7 8 9 3 3 1 2 3 4 5 6 7 8 9 我经常遇到的问题是,我的数组值似乎都是9。文件是整数,但我需要双倍的。我也有很多打印语句在那里,因为我试图调试发生了什么。我的异常处理尚未完成。在我能够正确实例化数组之后,我将返回并加强这一点。任何指点都将不胜感激。例如:只需打开一次文件,就可以获得维度并实例化数组 已更新但获取nullPoint

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

3 3 1 2 3 4 5 6 7 8 9 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());
    }
公共类帮助实现TopoMapInterface{
私有字符串文件名;
私有文件映射文件;
公共双[][]底图;
公共双[]电子地图;
提高公众智力水平;
公共帮助(字符串文件名)引发FileNotFoundException,
InvalidFileFormatException{
this.filename=文件名;
System.out.println(“读入文件:“+filename”);
字符串编号=”;
int行=0;
int col=0;
整数计数=0;
试一试{
扫描仪输入文件=新扫描仪(新文件(文件名));
while(inputFile.hasNextInt()){
row=Integer.parseInt(inputFile.next());
col=Integer.parseInt(inputFile.next());
System.out.println(“行:”+行);
System.out.println(“Col:+Col”);
baseMap=新的双[行][col];
System.out.println(baseMap[2][4]);
对于(int i=0;i
每次在
count1>2
时读入一个数字,然后迭代整个矩阵,并将
doubleVal
插入每个单元格;最后看到的值是9,因此到处都是9


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

首先,在使用
扫描仪或任何其他流时,应在最后关闭它们使用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;
        }
    }  
if(count1>2){
对于(int r=0;r
最后,您要打开文件两次!不需要这样做。您至少可以将代码更改为:

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());
    }
}
公共类帮助实现TopoMapInterface{
私有字符串文件名;
私有文件映射文件;
公共双[][]底图;
公共双[]电子地图;
提高公众智力水平;
公共帮助(字符串文件名)引发FileNotFoundException,
InvalidFileFormatException{
this.filename=文件名;
System.out.println(“读入文件:“+filename”);
字符串编号=”;
int行=0;
int col=0;
整数计数=0;
扫描仪输入文件=空;
试一试{
inputFile=新扫描仪(新文件(文件名));
number=inputFile.next();
系统输出打印项次(编号);
行=整数.parseInt(数字);
number=inputFile.next();
col=Integer.parseInt(数字);
int count1=0;
baseMap=新的双[行][col];
while(inputFile.hasNextInt()){
count1++;
number=inputFile.next();
int intVal=Integer.parseInt(数字);
double doubleVal=(double)intVal;
}//在这里关闭你的while循环
如果(计数1>2){
对于(int r=0;r
可能应该被替换为 double doubleVal=double.parseDouble(数字)

文件读取改进,因为不知道名称 虽然使用的是Java7和更高版本的构造,但它将显著改进此代码。
对于早期版本。如果可以,请升级,否则请记住关闭资源。

假设第一行的值为row first,然后是column

我会这么做

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());
}}
int row=Double.parseDouble(inputFile.next());
int col=Double.parseDouble(inputFile.next());

对于(int i=0;i我不确定为什么要扫描文件两次,但如果是这样,那么代码中就有问题了

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

如果这有助于你写作,[1,1,…,1]然后写作[2,2,…,2],最后再写作[9]。
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());
}}
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;
}