Arraylist в течение цикла - PullRequest
       2

Arraylist в течение цикла

0 голосов
/ 20 марта 2012

Итак, у меня есть 2 массива (player1List и player2List), в каждом из которых по 26 дюймов.Я провожу их через цикл for, сравнивая два числа от каждого.Если в одном списке число больше другого, в список победителей добавляется меньшее число.Однако, когда я запускаю его через цикл for в определенной точке, я получаю «indexOutOfBoundsException: Index 21: Size 21.»Как мне пройти через цикл, пока один из массивов не опустеет?Вот мой код.

    for (int i = 0; i < player1List.size; i++){
        if (player1List.get(i) < player2List.get(i)){
            System.out.printf("Player 1: %d\n", player1List.get(i));
            System.out.printf("Player 2: %d\n", player2List.get(i));
            System.out.printf("Player 2 wins round!\n");
            player2List.add(player1List.get(i));
            player1List.remove(player1List.get(i));
        }
        if (player1List.get(i) > player2List.get(i)){
            System.out.printf("Player 1: %d\n", player1List.get(i));
            System.out.printf("Player 2: %d\n", player2List.get(i));
            System.out.printf("Player 1 wins round!\n");
            player1List.add(player2List.get(i));
            player2List.remove(player2List.get(i));
        }
        if (player1List.get(i) == player2List.get(i)){

            System.out.printf("Player 1: %d\n", player1List.get(i));
            System.out.printf("Player 2: %d\n", player2List.get(i));
            System.out.printf("It's a tie, cards return to your deck.\n");

        }
        if (player1List.isEmpty()){
        System.out.printf("Player 2 wins the game.\n");
        break;
        }
        if (player2List.isEmpty()){
        System.out.printf("Player1 wins the game.\n");
        break;
        }
        }

Я задал похожий вопрос к этому, однако, это более сужено до того, что мне нужно.

Ответы [ 3 ]

1 голос
/ 20 марта 2012

Если вам необходимо промежуточные добавления в коллекцию, чтобы иметь значение на следующей итерации, тогда вам нужно убедиться, что ваши индексы верны.Держите два счетчика.При снятии - не увеличивать.Убедитесь, что список не больше текущего индекса.

Как видите, удаление и добавление во время итерации усложняет работу с индексами.Вот почему лучшим решением было бы использовать итераторы:

Iterator<Foo> it1 = list1.iterator();
Iterator<Foo> it2 = list2.iterator();

while(it1.hasNext() && it2.hasNext()) {
   Foo foo1 = it1.next();
   Foo foo2 = it2.next();
   if (..) {
       it2.remove();
   }
}

Когда вам нужно добавить одну из коллекций, вместо нее добавьте новую коллекцию, которая не мешает итерации.

0 голосов
/ 20 марта 2012

Вот так:

ArrayList<Integer> a = new ArrayList<Integer>(
    Arrays.asList(new Integer[]{0, 1, 5}));
ArrayList<Integer> b = new ArrayList<Integer>(
    Arrays.asList(new Integer[]{3, 4, 2}));

int sA = a.size();
int sB = b.size();

for (int i = 0, j = 0; i < sA && j < sB; i++, j++) {
  int iA = a.get(i);
  int iB = b.get(j);

  if (iA < iB) {
    b.add(iA);
    a.remove(i--);
    sA--;

  } else if (iA > iB) {
    a.add(iB);
    b.remove(j--);
    sB--;
  }
}

System.out.println("a: " + a);
System.out.println("b: " + b);

Вывод:

a: [5, 2]
b: [3, 4, 0, 1]

Предположим, что в первом списке есть N1 элементов, во втором списке N2 элементов, числоколичество итераций всегда будет ограничено меньшими из N1 и N2.например, если N1 равно 10, а N2 равно 11, будет не более 10 итераций.

Когда элемент переносится из одного списка в другой, мы уменьшаем счетчик индекса, а также общее количествоколичество элементов, которые нам нужно посмотреть для списка, из которого элемент был только что удален;нас не волнует список, в который был добавлен элемент, потому что он всегда добавляется в конце, и мы никогда не будем заходить так далеко в цикле.

Сравнения между соответствующими элементами в исходных списках ранееони модифицированы.В приведенном выше примере 5 сравнивается с 2, даже если 5 находится в индексе 0 в первом списке, а 2 - в индексе 2 во втором списке к моменту фактического сравнения.

0 голосов
/ 20 марта 2012
int size = list2.size()>list1.size()?list1.size():list2.size();
for(int i=0; i<size;i++){
   ...//do all your work here.

  size = list2.size()>list1.size()?list1.size():list2.size();//last line in loop
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...