Несовпадение типов данных цикла Java для каждого - PullRequest
0 голосов
/ 15 декабря 2010

В моем последнем проекте я конвертировал несколько обычных циклов for в цикл for-each и столкнулся с парадоксальной проблемой.

    imgMap = new int[rows][cols];

    for (int r=0; r<imgMap.length; r++) {
        rowArray = mapBR.readLine().split(",");
        for (int c=0; c<imgMap[r].length; c++) {
            imgMap[r][c] = Integer.parseInt(rowArray[c]);
        }
    }

    System.out.println(imgMap.length+", "+imgMap[0].length);

    // print array in rectangular form
    for (int[] r : imgMap) {
        for (int[] c : imgMap[r]) {
            System.out.print(" " + c[0]);
        }
        System.out.println("");
    }

imgMap - это двумерный массив int (int[][]) для хранения 'map'
mapBR - это BufferedReader внешнегофайл, из которого берется 'map'
Первый вложенный набор циклов for читает файл, второй вложенный набор for-each записывает его в консоль, чтобы убедиться, что он читается правильно.

Iя не мог найти способ заставить первый набор цикла for работать как цикл for-each, так что это подзадача, и я был бы рад, если бы кто-то мог мне помочь.

В любом случае, вернемся кГлавная проблема.когда я (пытаюсь) скомпилировать это, компилятор извергает ошибку, говорящую о том, что строка int[] c : imgMap[r] имеет несовместимые типы, но, и вот ловушка, когда я изменяю ее на int c : imgMap[r], , она вызывает ту же ошибку! Поскольку я не понимаю, как это может быть, кроме одного из этих типов, я сбит с толку.

Надеюсь, я предоставил достаточно информации.

IAmThePiGuy

Ответы [ 7 ]

5 голосов
/ 15 декабря 2010

В первом цикле вам нужно c, чтобы быть int, чтобы вы могли получить доступ к rowArray[c] - но это должно работать:

for (int[] row : imgMap) {
    String[] rowArray = mapBR.readLine().split(",");
    for (int c = 0; c < row.length; c++) {
        row[c] = Integer.parseInt(rowArray[c]);            
    }
}

Во втором цикле вам просто нужно пройти через r, а не через imgMap[r]:

for (int[] row : imgMap) {
    for (int value : row) {
        System.out.print(" " + value);
    }
    System.out.println("");
}

По сути, вам необходимо тщательно продумать используемые типы - представляет ли переменная индекс в массиве или сам массив.

4 голосов
/ 15 декабря 2010

вы пытаетесь использовать r, который является int [], как просто int. Это неверно. исправить это на

for (int c : r) {
  ...
}
3 голосов
/ 15 декабря 2010

Если я правильно понимаю, это должно быть так:

for (int[] r : imgMap) {
        for (int c : r) {
            ...
        }
        ...
    }
3 голосов
/ 15 декабря 2010
for (int[] r : imgMap) {
    for (int c : r) {
        System.out.print(" " + c);
    }
    System.out.println("");
}
3 голосов
/ 15 декабря 2010

Вот как это работает:

for (int[] row : imgMap) {
  for (int cell : row) {
    System.out.print(" " + cell);
  }
  System.out.println("");
}

Внешний цикл for обеспечивает все строки из матрицы, внутренний цикл for - все ячейки строки.

3 голосов
/ 15 декабря 2010
int[] c : imgMap[r]

в качестве индекса массива требуется int, и вы указали int[]

Это должно быть

   for (int[] r : imgMap) {
        for (int c : r) {
            System.out.print(" " + c);
        }
        System.out.println("");
    }
2 голосов
/ 15 декабря 2010

Вам нужно кодировать

for (int c : r)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...