我试图读取文件并生成2D数组。所以我相信我的构造函数会创建正确的维度,我只是不知道如何将实际值输入到数组中。
文件格式:
6
1 4 2 2 2 3
4 2 2 4 1 2
2 1 3 4 3 2
1 3 3 2 6 2
0 0 0 2 0 0
3 4 0 0 0 0
0 0 0 1 0 0
0 1 0 0 0 0
0 0 0 0 0 6
5 0 1 0 0 4
文件输入位于左侧,电路板结果应如右图所示:
6 | 1 4 2 2 2 3
1 4 2 2 2 3 | -----------
4 2 2 4 1 2 | 1|. . . 2 . .|4
2 1 3 4 3 2 | 3|3 4 . . . .|2
1 3 3 2 6 2 | 3|. . . 1 . .|2
0 0 0 2 0 0 | 2|. 1 . . . .|4
3 4 0 0 0 0 | 6|. . . . . 6|1
0 0 0 1 0 0 | 2|5 . 1 . . 4|2
0 1 0 0 0 0 | -----------
0 0 0 0 0 6 | 2 1 3 4 3 2
5 0 1 0 0 4 |
该文件的第一行是电路板的大小(6x6)。
第二行是"北到南(NS)"面对价值
第三条线是东西方(EW)"面对价值
第四行是"南到北(SN)"面对价值
第五行是"西向东(WE)"面对价值观。
其余的线将填充板。 0
不会放任何东西。
public static final int EMPTY = 0;
int[][] board;
int dim;
int[] NS, SN, EW, WE; //the outter arrays
public SkyscraperConfig(Scanner f){
while(f.hasNextLine()){
if(f.nextLine().length() == 1){
dim = f.nextInt();
}
else{
outterArrays = f.nextLine().length();
}
}
this.board = new int[dimension+1][dimension+1];//I made the dimension +1 to hold the outter arrays that hold the NS, SN, EW, and WE values
this.NS = new int[outterArrays+1];
this.SN = new int[outterArrays+1];
this.EW = new int[outterArrays+1];
this.WE = new int[outterArrays+1];
}
我的想法是创建一个2D数组,其大小与文件中的第一行相同。然后对于外部值,创建四个代表外部的数组。我不知道如何将这些外部阵列放入我的2D阵列中。
答案 0 :(得分:1)
与所有文件读取一样,尝试将每个任务分开不同的任务。问问自己"在我做之前我需要知道什么,以及我需要做些什么才能完成?"希望任务按顺序列出(每个任务只需要文件中的上面的信息),这就是你的问题。
您的任务似乎涉及三个子任务:
所以让我们使用它:
int[][] board;
int dim;
int[] NS, SN, EW, WE; //the outter arrays
public SkyscraperConfig(Scanner f){
//First line should be dimension line
int dim = Integer.parseInt(f.nextLine());
//Initalize data structures based off of this dimension
this.NS = new int[dim];
this.SN = new int[dim];
this.EW = new int[dim];
this.WE = new int[dim];
this.board = new int[dim][dim];
//Read in side arrays
//...
//Read in the board
//...
}
在这里我们可以猜测,我们在阅读这些内容时会有很多重复的代码 - 可能是开始设计辅助方法的时候了。我们似乎做了很多事情就是在一行中读取并解析其中的所有内容。所以让我们为那个
编写一个方法private static int[] parseIntLine(String line){
String[] arr = line.trim().split(' '); //Split on the space character
int[] intArr = new int[arr.length];
for(int i = 0; i < arr.length; i++){
intArr[i] = Integer.parseInt(arr[i]);
}
return intArr;
}
现在我们可以使用这个方法来完成我们的实现,让读取处理数组长度:
public SkyscraperConfig(Scanner f){
//First line should be dimension line
int dim = Integer.parseInt(f.nextLine());
//Only actual initialization we have to do is for the matrix's outer array
board = new int[dim][];
//Read in side arrays
NS = parseIntLine(f.nextLine());
EW = parseIntLine(f.nextLine());
SN = parseIntLine(f.nextLine());
WE = parseIntLine(f.nextLine());
//Read in the board - dim rows to read
for(int i = 0; i < dim; i++){
board[i] = parseIntLine(f.nextLine());
}
f.close();
}
现在有很多可能出错的事情你应该考虑到。如果第一行包含的不仅仅是一个数字怎么办?如果第一行包含非整数值怎么办?如果其中一个侧面阵列或其中一个板行的长度错误怎么办?如果没有足够的行来填充电路板怎么办?如果有太多行怎么办?对于这些问题中的每一个,您应该在方法中处理案例(通过try / catch或if-else逻辑),或者如果它是一个不可修复的问题,则抛出某种异常。