如何通过扫描文件来创建2D阵列

时间:2015-04-06 17:51:15

标签: java multidimensional-array java.util.scanner

我试图读取文件并生成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阵列中。

1 个答案:

答案 0 :(得分:1)

与所有文件读取一样,尝试将每个任务分开不同的任务。问问自己"在我做之前我需要知道什么,以及我需要做些什么才能完成?"希望任务按顺序列出(每个任务只需要文件中的上面的信息),这就是你的问题。

您的任务似乎涉及三个子任务:

  1. 弄清楚阵列和矩阵需要多大(1行)
  2. 读入侧面阵列(4行)
  3. 读入矩阵(N行)
  4. 所以让我们使用它:

    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逻辑),或者如果它是一个不可修复的问题,则抛出某种异常。