【问题标题】:Why, when I am transferring elements from 1d array to 2d array, on getting the last 1d array made from previous loop为什么,当我将元素从 1d 数组传输到 2d 数组时,在从前一个循环中获取最后一个 1d 数组时
【发布时间】:2015-01-26 00:55:28
【问题描述】:
while (scanner.hasNextLine()) {
            line = scanner.nextLine();
            if (line.charAt(0) != '#') {
                c++;
                //looking to get dimensions of line segments from file.  
                dimensions = new int[c][4];

                //Split my file input into an array of tokens(strings)
                tokens = line.split(",");

                for (int i = 0; i < tokens.length; i++) {
                    //Parse strings to int. 
                    dimtoke[i] = Integer.parseInt(tokens[i]);

                    for (int k = 0; k < dimensions.length; k++) {
                        for (int j = 0; j < dimensions[0].length; j++) {
                            //attempt to fill 2d array with contents from file.
                            dimensions[k][j] = dimtoke[j];
                        }
                    }
                }
            }
        }

我得到一个二维数组,其中包含文件中的最后一个维度,而不是所有维度。维度在一行文本中以 4 个为一组,所以我用我从文件中读取的每一行中的这些标记创建了一个数组,这样我就可以将它们解析为整数。在将一维整数数组传输到二维数组的过程中发生了一些事情。

【问题讨论】:

  • 为什么有四个嵌套循环?此外,您已将值分配给 dimtoke[i](不是 dimtoke[j]),例如 dimensions[k][j] = dimtoke[i];
  • 举一个你输入的例子。

标签: java arrays file token


【解决方案1】:

您必须像这样关闭 {} 令牌循环:

for (int i = 0; i < tokens.length; i++) {
                //Parse strings to int. 
                dimtoke[i] = Integer.parseInt(tokens[i]);
}//you need a closing here
                for (int k = 0; k < dimensions.length; k++) {
                    for (int j = 0; j < dimensions[0].length; j++) {
                        //attempt to fill 2d array with contents from file.
                        dimensions[k][j] = dimtoke[j];
                    }
                }

我会尽力向你解释。

每次你在指令中得到一个 int int dimtoke[i] = Integer.parseInt(tokens[i]);

在获取 dimtoke[i+1] 中的下一个 int 之前,您会进入一个循环,在该循环中使用该 dimitoke[i] 填充 2d 数组中的所有 int。

当这些循环完成后(所有二维数组都只填充了 1 个 int),您再次向上并用下一个 int 填充 dimitoke,然后再次用该 int 填充所有二维数组。

你需要做的是首先完成for循环并用整组整数填充dimitoke,然后用dimitoke中的整数填充二维数组。

您的问题是每次将 int 放入 dimitoke 时都会填充整个数组,因此每次整个 2d 数组都只被 1 个 int 覆盖。

我预计会出错的另一件事:

当你填充二维数组时,你把 j 变量放在两个维度和 dimitoke 中,所以如果 dimitoke 长度不等于维度的第二个数组长度,你将再次填充每一行,如果 dimitoke 是更大,如果它更小,则 indexOutOfBounds Excepcion。这是一个例子:

dimitoke 维度 = 10 = {0,1,2,3,4,5,6,7,8,9}

如果维度的维度为 4,则维度的输出将为:

0,1,2,3

0,1,2,3

0,1,2,3

。 .. c 行。

要修复它,您可以做的是更改 int n 的 dimitoke 变量(例如)并更改如下代码:

int n =0;
for (int k = 0; k < dimensions.length; k++) {
    for (int j = 0; j < dimensions[0].length; j++) {
                          //attempt to fill 2d array with contents from        file.
                         dimensions[k][j] = dimtoke[n];
                           n++;
                      }
                   }

我希望错误现在已经解决了

【讨论】:

    【解决方案2】:

    不完全知道你想做什么。但我认为你应该将两个循环分开:

    1. 为dimtoke赋值。
    2. 为维度赋值。

    所以我认为显然,您应该在此处附上循环:

    for (int i = 0; i < tokens.length; i++) {
        //Parse strings to int. 
        dimtoke[i] = Integer.parseInt(tokens[i]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2019-05-05
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      相关资源
      最近更新 更多