Кажется, что расширенный цикл for проходит через все элементы одновременно.Но так ли это или мой код неверен? - PullRequest
0 голосов
/ 17 июня 2019

Извините за заголовок.Я пытаюсь написать программу, которая заменяет элементы из массива A элементами из массива B того же размера, а также удаляет эти элементы из массива B. Ничего особенного, просто проверяю что-то перед моим экзаменом.

Я попытался сделать это с помощью вложенных циклов for, первый из которых был "традиционным циклом for", а второй - "расширенным циклом for", но по какой-то причине вместо замены элемента 0 из массива A на элемент 0из массива B он заменяет все элементы из массива A на элемент 2 из массива B. И при попытке удалить элементы выдает ошибку.Любая идея, почему это происходит?

Вывод включен в блок кода, потому что stackoverflow просто не позволит мне публиковать, если это не так.

И строка 30 для "(String s: list2)».Я вынул заголовок.

public class Test {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("one");
        list1.add("two");
        list1.add("three");

        List<String> list2 = new ArrayList<>();
        list2.add("four");
        list2.add("five");
        list2.add("six");

        System.out.println(list1);
        System.out.println(list2);

        for(int i = 0; i < list1.size(); i++){
            for(String s : list2){
                list1.set(i, s);
                //list2.remove(i);
            }
        }
        System.out.println(list1);
    }
}

Вывод без строки "list2.remove (i)":

[one, two, three]
[four, five, six]
[six, six, six]

Вывод с "list2.remove (i)"строка:

[one, two, three]
[four, five, six]
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
    at java.util.ArrayList$Itr.next(ArrayList.java:859)
    at Test.main(Test.java:30)
C:\Users\izabe\AppData\Local\NetBeans\Cache\10.0\executor- 
snippets\run.xml:111: The following error occurred while executing this 
line:
C:\Users\izabe\AppData\Local\NetBeans\Cache\10.0\executor- 
snippets\run.xml:94: Java returned: 1

Ответы [ 3 ]

2 голосов
/ 17 июня 2019

Вы очень сильно усложняете вещи. Вы делаете вещи «вручную», которые уже реализованы классами, которые вы используете!

Реальный ответ здесь - сделать шаг назад и изучить интерфейс, который вам предлагает Коллекция, или, что более уместно, интерфейс Список .

То, что вы видите, есть такие звонки:

  • clear () : удалить все элементы, хранящиеся в настоящее время в коллекции
  • addAll () : добавить все элементы другой коллекции в другую

Также обратите внимание, что ваше исключение почти самоочевидно, и, кроме того, его много раз спрашивали и отвечали здесь, см., Например, здесь . Реальный ответ здесь снова: не просить объяснений, а быть любопытным и использовать поисковую систему.

Вы учитесь программированию, завоевывая мир сами , а не спрашивая объяснений у других.

1 голос
/ 17 июня 2019

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

Рабочая версия вашего кода может выглядеть как

//assuming both array have same length
for(int i = 0; i < list1.size() && list1.size() <= list2.size(); i++){
          list1.set(i, list2.get(i));

}

Во-вторых, вы получаете параллельную модификацию, исключение - вы читаете и удаляете (записываете) массив одновременно.(флаг мода не сбрасывается).Для этого лучше использовать Iterator <>

Улучшенный код будет выглядеть как

//assuming both array have same length
int i = 0;
Iterator<String> iterator = list2.iterator();
while(iterator.hasNext() && i < list1.size()) {
    list1.set(i, iterator.next());
    i++;
    iterator.remove();   
}
0 голосов
/ 17 июня 2019

Да. Вы также можете сделать:

    list1.clear();
    for(String s : list2){
        list1.add(s);
    }
...