如何从字符串列表中填充二维数组

时间:2014-11-17 21:56:26

标签: java arrays multidimensional-array

我的程序应该读取一个如下所示的文件:

8 7
~~~~~~~
~~~~~~~
B~~~~~~
~~~~~~~
~~~~B~~
~~~~B~~
~~~~~~B
~~~~~~~

我需要忽略第一行(8和7)并将以下字符读入二维数组。我认为我写的代码会这样做,但它没有。我需要map [0] [0]对应第一个"〜",并且map [3] [0]对应第一个' B'。这是我正在使用的代码。

try 
    {
    File file = new File(args[1]);
    Scanner sc = new Scanner(file);     
    String themap = sc.nextLine();
    theFirst = themap.indexOf(" ");
    theSecond = themap.lastIndexOf(" ");
    int rows = Integer.parseInt(themap.substring(0, theFirst));
    int columns = Integer.parseInt(themap.substring(theSecond+1)); 
    char[][] map = new char[rows][columns];  

    while (k < rows)                                
        {   
        //System.out.println(k);
        while (j < columns)
            {
            while (sc.hasNextLine()) 
                {
                themap = sc.nextLine();                                        
                System.out.println(themap);
                map[k][j] = themap.charAt(j);
                System.out.println(map[k][j]);
                }

            j++;
            }
        k++;
        }
        sc.close();
    } 
catch (Exception e) 
    {
    System.out.println("ERROR: File does not exist");
    }

我在那里输入一个测试语句,看看map [j] [k]发生了什么,它只打印出每一行的第一个字符。就像我说的那样,我需要它来对应我从中读取它的文件,但我不确定我做错了什么。帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

你的问题是你正在读每一行,因为内部while循环每个(不是每行行一行 )。

nextLine()调用移到列循环之外。

其他改进:

  • 很明显,第一行是数字或行和列 - 您应该依赖并使用
  • 不要使用while循环,使用for循环并命名循环变量rowcolumn以使代码更具可读性
  • 不要使用hasNextLine()作为循环控件 - 如果必须,请检查它是否存在异常,如果有一行但不是
  • 通过创建一个返回给定String
  • 的char数组的方法,使代码更加模块化
  • 如果行长不正确,请考虑抛出异常
  • 使用nextInt()阅读数字

答案 1 :(得分:0)

你第一次在最里面的循环中反复呼叫nextLine();之后没有什么可读的了。所以你唯一填充的是map[0][0]

你需要完全摆脱最里面的while循环,并将sc.nextLine()移到你的外循环中。

基本结构应该是这样的。随意添加任何println调用和错误检查。此外,许多人会发现使用for循环代替while更直观。

while (k < rows) {   
    themap = sc.nextLine();                                        
    j = 0;
    while (j < columns) {
        map[k][j] = themap.charAt(j);
        j++;
    }
    k++;
}

答案 2 :(得分:0)

您的循环不正确。试试这个。 你确定没有行和列的逻辑是好的,没有问题。有些人提到你丢弃了第一行,但你没有。

    for(int i=0;i<rows&&sc.hasNextLine();i++){
        themap = sc.nextLine();
        for(int j=0;j<columns;j++){
            map[i][j] = themap.charAt(j);
            System.out.print(map[i][j]);
        }
        System.out.println();
    }