Почему изменяется массив?

312
25 июля 2022, 02:10

У меня есть уже заполненный массив basePlan (т.е. есть значения помимо null). Я делаю массив-буфер bufferBasePlan в методе improvingPlan, чтобы не вносить изменений в basePlan, но почему-то после выполнения цикла while, basePlan заполняется null. Не могу понять в чём причина.

private void improvingPlan() {
        boolean finish = false;
        boolean searchInWarehouses = false;
        ArrayList<Integer> recW = new ArrayList<>();
        ArrayList<Integer> recS = new ArrayList<>();
        String[][] bufferBasePlan = basePlan.clone();
        recW.add(warehousesCoordinates);
        recS.add(storesCoordinates);
        while (!finish) {
            if (searchInWarehouses) {
                for (int i = 0; i < warehouses.length; i++) {
                    if (bufferBasePlan[i][recS.get(recS.size() - 1)] != null) {
                        for (int j = 0; j < stores.length; j++) {
                            if (i == warehousesCoordinates & j == storesCoordinates) {
                                recW.add(i);
                                recS.add(recS.get(recS.size() - 1));
                                finish = true;
                                break;
                            }
                            else if (bufferBasePlan[i][j] != null & j != recS.get(recS.size() - 1)) {
                                recW.add(i);
                                recS.add(recS.get(recS.size() - 1));
                                finish = false;
                                searchInWarehouses = false;
                                bufferBasePlan[i][recS.get(recS.size() - 1)] = null;
                                break;
                            }
                        }
                        if (finish)
                            break;
                    }
                }
            }
            else {
                for (int j = 0; j < stores.length; j++) {
                    if (bufferBasePlan[recW.get(recW.size() - 1)][j] != null) {
                        for (int i = 0; i < warehouses.length; i++) {
                            if (i == warehousesCoordinates & j == storesCoordinates) {
                                recW.add(recW.get(recW.size() - 1));
                                recS.add(j);
                                finish = true;
                                break;
                            }
                            else if (bufferBasePlan[i][j] != null & i != recW.get(recW.size() - 1)) {
                                recW.add(recW.get(recW.size() - 1));
                                recS.add(j);
                                finish = false;
                                searchInWarehouses = true;
                                bufferBasePlan[recW.get(recW.size() - 1)][j] = null;
                                break;
                            }
                        }
                        if (finish)
                break;
                    }
                }
            }
        }
        for (int i = 0; i < warehouses.length; i++) {
            for (int j = 0; j < stores.length; j++) {
                System.out.print(i + "," + j + ": " + baseLine[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println();
}
Answer 1

Как и сказал tym32167, создаётся копия только верхнего уровня.

private String[][] copyArray() {
        String[][] bufferBasePlan = new String[basePlan.length][basePlan[0].length];
        for ( int i = 0 ; i < basePlan.length; ++i)
        {
            System.arraycopy(basePlan[i], 0, bufferBasePlan[i], 0, basePlan[i].length);
        }
        return bufferBasePlan;
}
READ ALSO
Как реализовать код задачи?

Как реализовать код задачи?

Нужно решить задачу, условие которой звучит так:

339
Некорректная работа SwitchButton в ViewHolder-e itemView в recyclerView. (Room)

Некорректная работа SwitchButton в ViewHolder-e itemView в recyclerView. (Room)

Почему-то SwitchButton-ы в item-ах в recyclerView работают некорректноПри переключении - иногда переключается не только тот, который переключаю, но и еще...

296
BottomNavigationView и Fragment. Как сохранить состояние?

BottomNavigationView и Fragment. Как сохранить состояние?

Есть BottomNavigationView и 3 Fragment'аФрагмент "Home" содержит ScrollView

345
Проблема с итерацией в цикле

Проблема с итерацией в цикле

Есть некоторая коллекция(исходник: Проблема с удалением переменных классов потомков):

373