我正在使用扫描仪阅读文件。格式化文件,第一行是数组的维度。下一行包含第一行,下一行包含第二行,等等。示例文件:
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());
}
答案 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;
}