Для каждого и присвоение 2d массиву Java - PullRequest
3 голосов
/ 28 ноября 2011

Я использую цикл for-each для перемещения по 2d массиву символов в базовой Java-программе. Это работает, за исключением небольшой части в конце. Вот мой класс:

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("");
    }
}

По сути, я хочу взять любой двумерный массив с заданными пользователем размерами и заполнять его буквами алфавита снова и снова, пока он не заполнится. Метод checkIsNumeric просто проверяет, является ли String числовым, метод createArray создает двумерный массив с заданными пользователем измерениями, а метод fillArray заполняет массив буквами из строки. Но когда я перебираю массив в конце main и печатаю каждый символ, ничего не печатается. Почему?

Ответы [ 3 ]

6 голосов
/ 28 ноября 2011

Изменить 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;
}

Таким образом, модифицируется фактический массив a, а не копии, созданные циклом for-each.

Который даст вывод (который, я полагаю, правильный):

How tall do you want the array to be?
5
How wide do you want the array to be?
4
abcde
fghij
klmno
pqrst

То же самое относится к createArray, если вы хотите, чтобы каждый char был инициализирован в ' '. В main, если вы разыгрываете d как int и печатаете его, вы увидите, что каждый char установлен в свое первоначальное значение значение 0.

1 голос
/ 28 ноября 2011

В общем: проблема в том, что вы не можете присвоить новые значения переменной, определенной в цикле 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
1 голос
/ 28 ноября 2011

Вы назначаете char ( d ) значение '' , тогда область действия d исчезает.Вы не присваиваете что-либо значение массива.

...