Обращение элементов в массиве 3X3 с использованием ArrayList - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь перевернуть изображение, и мой подход состоит в том, чтобы переворачивать элементы матрицы 3X3 строка за строкой. Я использую статический массив с именем matrix .

После того, как я вставил значения в массив 3 на 3, я перебираю все строки массива и сохраняю значения в ArrayList. Затем я переставляю элементы в этом списке в отдельную функцию и пытаюсь вставить поменяемые значения в исходный массив в функцию (учитывая, что массив является статическим). Когда я пытаюсь это сделать, я получаю индекс из привязанного исключения. Я попробовал все с моей стороны, но эта проблема, кажется, не уходит. Вот мой код:

Я поместил операторы print, чтобы проверить размер списка, переданного, полученного и после замены.

import java.util.ArrayList;
import java.util.Scanner;

public class FlipAndInvert {

    static int rows = 0;
    static int columns = 0;
    static int matrix[][] = new int[rows][columns];

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner input = new Scanner(System.in);
        System.out.println("Enter the dimensions of the array : ");

        System.out.println("Enter # of Rows  : ");
        rows = input.nextInt();
        input.nextLine();

        System.out.println("Enter # of Columns  : ");
        columns = input.nextInt();
        input.nextLine();

        int matrix[][] = new int[rows][columns];

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {

                System.out.print("Enter [" + i + "][" + j + "] : ");
                int data = input.nextInt();
                input.nextLine();

                if (data == 0 || data == 1) {
                    matrix[i][j] = data;
                } else {
                    System.out.println("Enter Binary Format");
                }

            }
        }

        for (int i = 0; i < rows; i++) {
            ArrayList<Integer> store = new ArrayList<Integer>();
            for (int j = 0; j < columns; j++) {
                store.add(matrix[i][j]);
            }
            System.out.println("List Size Passed : " + store.size());

            swap(store, i);

        }

    }

    public static void swap(ArrayList<Integer> list, int r) {

        int i = 0;
        int j = list.size() - 1;

        System.out.println("List Size Received : " + list.size());

        if (list.size() % 2 == 1) {

            // for odd list length

            System.out.println("Inside if statememt");

            while (j - i >= 2) {

                int temp = list.get(i);
                list.set(i, list.get(j));
                list.set(j, temp);
                i = i + 1;
                j = j - 1;

            }
            System.out.println("List Size After Swap : " + list.size());

            System.out.println("Outside while in if statememt");

            System.out.println(matrix[0][0]);

        } else {

            // for even list length

            while (j - i >= 1) {

                int temp = list.get(i);
                list.set(i, list.get(j));
                list.set(j, temp);
                i = i + 1;
                j = j - 1;

            }

            for (int c = 0; c < columns; c++) {

                matrix[r][c] = list.get(c);

            }
        }

    }

}

Когда я заменяю элементы в массиве в последнем цикле for, я получаю исключение Array Index Out of Bound. Может кто-нибудь, пожалуйста, направьте меня сюда.

Ответы [ 4 ]

0 голосов
/ 11 января 2019

Нашел решение для этого:

for (int i = 0; i < rows; i++) {
ArrayList<Integer> store = new ArrayList<Integer>();
for (int j = 0; j < columns; j++) {
    store.add(matrix[i][j]);
}
System.out.println("List Size Passed : " + store.size());

// swap(store, i);

Collections.reverse(store);
for (int j = 0; j < columns; j++) {
    matrix[i][j] = store.get(j);
}

}

Я перевернул список «store» и сохранил результат в массиве, когда вызвал swap (...). Это также избавляет от необходимости вызывать swap (...)

Спасибо всем за поддержку.

0 голосов
/ 11 января 2019

Полагаю, инициализация массива нарушена, и одна из строк вашей матрицы не содержит 3 элемента, но вы не опубликовали эту часть кода. Я скопировал опубликованные вами детали, а также инициализацию поля матрицы, и это работает нормально!

private static int columns = 3;
private static int rows = 3;
private static Integer[][] matrix = {{1,2,3}, {4,5,6}, {7,8,9}};

public static void main(String[] args) {

    for (int i = 0; i < rows; i++) {
        ArrayList<Integer> store = new ArrayList<>();
        for (int j = 0; j < columns; j++) {
            store.add(matrix[i][j]);
        }
        System.out.println("List Size Passed : " + store.size());

        swap(store, i);

    }

}
public static void swap(ArrayList<Integer> list, int r) {

    int i = 0;
    int j = list.size() - 1;

    System.out.println("List Size Received : " + list.size());

    if (list.size() % 2 == 1) {

        // for odd list length

        System.out.println("Inside if statememt");

        while (j - i >= 2) {

            int temp = list.get(i);
            list.set(i, list.get(j));
            list.set(j, temp);
            i = i + 1;
            j = j - 1;

        }
        System.out.println("List Size After Swap : " + list.size());

        System.out.println("Outside while in if statememt");


        for (int c = 0; c < columns; c++) {

            matrix[r][c] = list.get(c);

        }

    }
}

Пожалуйста, приложите весь код, включая инициализацию матрицы, но я уверен, что это та проблема.

0 голосов
/ 11 января 2019

У вас есть локальная переменная matrix, которую вы инициализируете в main, но та, которую вы используете в swap, является глобальной, которая пуста и имеет размер [0] [0].

0 голосов
/ 11 января 2019

Вы указали размер матрицы как

static int[][] matrix=new int[3][3]; ?
...