Проблема с вектором метода добавления 2D-массива в java

#java #vector

#java #вектор

Вопрос:

Я объявил вектор 2D-массива в java. На каждом шаге я добавляю массив в вектор с помощью метода add (). Но когда я распечатываю этот вектор, чтобы посмотреть, что внутри, я получаю неожиданный результат. Ни один из этих массивов не является данными, которые были добавлены. Мой код:

     static Vector<int[][]> latinSquare;
    static int[][] square;
    static int[][] maskRow, maskCol;

    static int[] extractCoor(int x, int n) {
        int[] ans = new int[2];
        ans[0] = x / n;
        ans[1] = x % n;
        return ans;
    }

    static void backtrack(int pos, int n) {
        int[] coor = extractCoor(pos, n);
        int x = coor[0], y = coor[1];

        for (int candidate = 0; candidate < n; candidate  ) {
            if (maskRow[x][candidate] == 0 amp;amp; maskCol[y][candidate] == 0) {
                square[x][y] = candidate;

                if (pos == n * n - 1) {
                    latinSquare.add(square);
                    printArr(square, n, n);
                } else {
                    maskRow[x][candidate] = 1;
                    maskCol[y][candidate] = 1;
                    backtrack(pos   1, n);
                    maskRow[x][candidate] = 0;
                    maskCol[y][candidate] = 0;
                }
            }
        }
    }
  

Когда я распечатываю square , у меня есть правильный список латинского квадратного размера n = 3.

 0 1 2 
1 2 0 
2 0 1 

0 1 2 
2 0 1 
1 2 0 

0 2 1 
1 0 2 
2 1 0 

0 2 1 
2 1 0 
1 0 2 

1 0 2 
0 2 1 
2 1 0 

1 0 2 
2 1 0 
0 2 1 

1 2 0 
0 1 2 
2 0 1 

1 2 0 
2 0 1 
0 1 2 

2 0 1 
0 1 2 
1 2 0 

2 0 1 
1 2 0 
0 1 2 

2 1 0 
0 2 1 
1 0 2 

2 1 0 
1 0 2 
0 2 1 
  

Но когда я распечатываю вектор latinSquare , у меня неверный вывод:

     static void latinSquareBuilder(int n) {
        latinSquare = new Vector<int[][]>();
        maskRow = new int[n][n];
        maskCol = new int[n][n];
        square = new int[n][n];

        backtrack(0, n);

        for (int i = 0; i < latinSquare.size(); i  )
            printArr(latinSquare.get(i), n, n);
    }

    static void printArr(int[][] arr, int n, int m) {
        for (int i = 0; i < n; i  ) {
            for (int j = 0; j < m; j  ) {
                System.err.print(arr[i][j]   " ");
            }
            System.err.println();
        }
        System.err.println();
    }

  

Вывод:

 2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 
  

Ответ №1:

Это потому, что квадрат является матрицей, а latinSquare — вектором. Посмотрите здесь

Комментарии:

1. Я не понимаю, что вы имеете в виду. Я просто использую векторную встроенную библиотеку java для хранения списка 2D-массива, я не выполняю никаких математических операций с этими данными.

2. Попробуйте этот способ latinSquare = new Vector<int>[][] ();