对于每个和分配给2d数组Java

对于每个和分配给2d数组Java,java,foreach,char,multidimensional-array,Java,Foreach,Char,Multidimensional Array,我使用for-each循环在一个基本java程序中遍历一个2d字符数组。除了最后的一小部分,它是有效的。这是我的班级: static String letters = "abcdefghijklmnopqrstuvwxyz"; public static boolean checkIsNumeric(String s) { boolean haveBeenNonDigitCharacters = false; char[] chars = s.toCharArray();

我使用for-each循环在一个基本java程序中遍历一个2d字符数组。除了最后的一小部分,它是有效的。这是我的班级:

static String letters = "abcdefghijklmnopqrstuvwxyz";

public static boolean checkIsNumeric(String s) {
    boolean haveBeenNonDigitCharacters = false;
    char[] chars = s.toCharArray();
    for(char c : chars)
        if(!Character.isDigit(c)) {
            haveBeenNonDigitCharacters = true;
            break;
        }

    if(haveBeenNonDigitCharacters) 
        return false;
    else 
        return true;
}

public static char[][] createArray() {
    String height;
    String width;
    Scanner s = new Scanner(System.in);
    do {
        System.out.println("How tall do you want the array to be?");
        height = s.next();
    } while(!checkIsNumeric(height));
    do {
        System.out.println("How wide do you want the array to be?");
        width = s.next();
    } while(!checkIsNumeric(width));

    int intHeight = Integer.parseInt(height);
    int intWidth = Integer.parseInt(width);

    char[][] chars = new char[intWidth][intHeight];

    for(char c[] : chars) {
        for(char d : c)
            d = ' ';
    }

    return chars;
}

public static char[][] fillArray(char[][] a) {
    int counter = 0;
    for(char c[] : a) {
        for(char d : c) {
            if(counter >= 26)
                counter = 0;
            d = letters.charAt(counter);
            counter++;
        }
    }
    return a;
}

public static void main(String[] args) {
    char[][] chars = createArray();
    chars = fillArray(chars);

    for(char c[] : chars) {
        for(char d : c) {
            System.out.print(d);
            if(d == ' ')
            System.out.print("a");
        }
        System.out.println("");
    }
}

基本上,我想做的是,获取任何具有用户指定维度的2d数组,并用字母表中的字母反复填充,直到填满为止。
checkIsNumeric
方法只检查
String
是否为数字,
createArray
方法创建具有用户指定维度的二维数组,而
fillArray
方法用字符串中的字母填充数组。但当我在main结尾的数组中循环并打印每个字符时,什么也不会打印。为什么?

fillArray
更改为:

public static char[][] fillArray(char[][] a) {
    int counter = 0;

    for (int i = 0; i < a.length; i++) {
        for (int j = 0; j < a[i].length; j++) {
            if(counter >= 26)
                counter = 0;
            a[i][j] = letters.charAt(counter);
            counter++;
        }
    }

    return a;
}
如果希望将每个
char
初始化为
'
,则
createArray
也是如此。在
main
中,如果将
d
转换为
int
并打印,您将看到每个
char
都设置为其初始值
值为0。

您正在为字符(d)赋值',然后d的范围消失。您没有为数组赋值。

一般来说:问题是,您不能为for each循环中定义的变量赋值,而期望被迭代的底层数据结构得到修改。例如,此代码对数组没有影响:

int[] array = {1, 2, 3};

for (int e : array)
    e = 0;          // array doesn't change!
要实际修改阵列,需要执行以下操作:

for (int i = 0, n = array.length; i < n; i++)
    array[i] = 0;   // now all elements in array are zero
for(int i=0,n=array.length;i
完美-谢谢。为什么for each不做相同的事情?@Rickay:
d
(来自
char d:c
)是数组中特定位置的
char
的副本。它不是对数组中的
字符的引用,因此您实际上是将该值赋给一个临时变量。哦。。。我从来不知道每个循环都是这样工作的!哇,谢谢你!
for (int i = 0, n = array.length; i < n; i++)
    array[i] = 0;   // now all elements in array are zero