Java ArrayList.removeAll () - PullRequest
       2

Java ArrayList.removeAll ()

0 голосов
/ 31 декабря 2018

Я хочу создать фрагмент кода, который будет принимать список списков, разбивать его на подсписки из 9 и удалять числа из всех списков в каждом из подсписков.Однако, когда мой код запускается, он удаляет числа из всех списков, а не только раздел, взятый из исходного списка

for (int startingIndex = 0; startingIndex <= 8; startingIndex++) {
        int initialIndex = startingIndex * 9;
        ArrayList<ArrayList<String>> gridRow = new ArrayList<ArrayList<String>>();
        gridRow.addAll((posabilityGrid.subList(initialIndex, initialIndex+9)));
        System.out.println("gridrow - " + gridRow);
        ArrayList<String> numbers = new ArrayList<String>();
        for (ArrayList<String> posability : gridRow) {
            if (posability.size() == 1) {
                numbers.add(posability.get(0));
            }
        }
        System.out.println("numbers - " + numbers);


        for (ArrayList<String> posability : gridRow) {
                posability.removeAll(numbers);
        }
        System.out.println("newgrid - " + gridRow);

edit: Когда начальный индекс сначала равен 0:

строка сетки - [[1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [4], [3], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [2], [1,2, 3, 4, 5, 6, 7, 8, 9], [9]]

чисел - [4, 3, 2, 9]

тогда правильнораспечатывает:

newgrid - [[1, 5, 6, 7, 8], [1, 5, 6, 7, 8], [], [], [1, 5,6, 7, 8], [1, 5, 6, 7, 8], [], [1, 5, 6, 7, 8], []]

Однако при запускеиндекс равен 1 в начале:

gridrow - [[1, 5, 6, 7, 8], [1, 5, 6, 7, 8], [5], [1,5, 6, 7, 8], [1, 5, 6, 7, 8], [9], [1, 5, 6, 7, 8], [1, 5, 6, 7, 8], [1]]

вместо ожидаемых

[[1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [5], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1]]

В этом разделе списка по какой-то причине были удалены предыдущие номера, когда он должен оставаться прежним, поэтому вычитается только новый набор чисел

2-е редактирование: я добавил строку

numbers.clear();

но у меня все та же проблема.Я распечатал список номеров и проверил, что он очищается каждый раз, но кажется, что главный список изменяется при первом «posability.removeAll (numbers);»

Edit 3: я решил этоТеперь проблема была с ArrayList и Sublists.Как только я изменил список, чтобы создать новую глубокую копию ArrayList, а не просто ссылаться на старую, код прекрасно работает.

List<List<String>> posabilityGridClone = posabilityGrid.stream().map(it -> new ArrayList(it)).collect(Collectors.toList());
        gridRow.addAll((Collection<? extends ArrayList<String>>) (posabilityGridClone.subList(initialIndex, initialIndex+9)));

1 Ответ

0 голосов
/ 31 декабря 2018

Добавьте numbers.clear() в качестве последней строки вашего основного цикла.Ваш numbers массив сохраняется между циклами, и это проблема, если я правильно понимаю, что вы ожидаете получить.

EDIT Извините, сначала я не видел чисел.Я думал, что он был создан вне области.

Ваша проблема на самом деле в этой строке:

gridRow.addAll((posabilityGrid.subList(initialIndex, initialIndex+9)));

Когда вы создаете подсписок, у вас есть две проблемы здесь:

1) Sublist - это просто представление того же массива.(удаление элемента из подсписка влияет на исходный список)

2) Элементы массива являются ссылками на другие массивы.Поэтому, когда вы запускаете removeAll, вы фактически удаляете все это из исходных массивов.

Вам нужно сделать глубокую копию своих массивов и использовать ее вместо исходного.

List<List<String>> posabilityGridClone = posabilityGrid.stream().map(it -> new ArrayList(it)).collect(Collectors.toList());
gridRow.addAll((posabilityGridClone.subList(initialIndex, initialIndex+9)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...