在Java中:在构造函数中使用foreach循环来初始化多维数组数据字段

时间:2014-10-01 00:54:21

标签: java multidimensional-array datafield

所以我正在尝试创建一个封装2D数组字符的类。特别是,我想要做的是定义默认构造函数,以便封装的2D数组包含默认的char(在这种情况下为'#')。我的问题:当我尝试通过嵌套的foreach循环系统地使用默认char填充数组时,编译器不会确认我正在使用第二个嵌套循环的初始化char参数c,尽管我显然在使用赋值c ='# ”。引用Eclipse,“不使用局部变量c的值。”

以下是相关代码:

public class 2DCharArr
{
 private char[][] chars;
 private byte length_x, length_y;

 public 2DCharArr()
 {
  length_x = 10; length_y = 10;
  chars = new char[length_x][length_y];
  for (char[] arr : chars)
   for (char c : arr)
    c = '#'; // Does not signal to Eclipse that c was used.
 }
}

我在foreach循环中的语法是否有问题,因此编译器应该无法确认我对c的使用?有人为我清除它是很好的,因为它阻止我使用foreach循环来创建包含多维数组的对象,尽管我觉得我应该能够如果我能够非常称职用语言。提前感谢您的见解!

2 个答案:

答案 0 :(得分:4)

使用enhanced-for语句时无法指定值。您将不得不以常规方式迭代它们并将值分配给特定索引。

for(int i= 0; i < chars.length; i++) {
    for(int j = 0; j < chars[i].length; j++) {
        chars[i][j] = '#';
    }
}

is defined in the JLS的增强方式的细微差别:

  • 如果它是Iterable,它会使用其迭代器,结果为next()绑定到您的变量。
  • 如果它是一个数组类型,它会创建一个索引值绑定到变量的for循环。

在任何一种情况下,您都无法将传入的变量修改为任何有意义的效果,例如赋值。

答案 1 :(得分:1)

您对分配的使用感到困惑:

int x = 5;
int y = x;
y = 6;

不会改变x的值。你的内循环基本上是&#34;说&#34;:

char c = arr[current index];
c = '#';

这不会更改arr[current index]的值,只会将c的值更改为&#39;#&#39;,但保留原始arr数组不变。编译器警告您,您正在创建的变量c永远不会被使用(意味着永远不会读取)。

请注意,此循环可以正常工作:

for (char[] arr : chars)
    for (int x = 0; x < arr.length; x++)
        arr[x] = '#';

外部foreach循环指定arr变量指向char[]内的当前chars对象。然后arr[x]使用值&#39;#&#39;指定第x个元素。