Есть ли способ удалить только первый элемент в списке с помощью итератора? - PullRequest
0 голосов
/ 31 марта 2020

У меня есть List из Integers, который содержит 1 и 2. Итерируя через l oop, у меня было бы 2 if блоков, и в конце я бы удалил первый Integer текущего List.

Я попытался использовать Iterator и сделать remove(), но он также удаляет все вхождения Integer, которые я мог бы сохранить, даже если бы я хотел удалить только первый.

Вот как будет выглядеть мой код:

                Collections.reverse(currentPlayer);
                for (Iterator<Integer> iterator = currentPlayer.iterator(); iterator.hasNext();) {
                    int currentWinner = iterator.next();
                    if (currentWinner==1) {
                        switch ((String) firstPlayerScore.getText()) {
                            case "40":
                                firstPlayerScore.setText("30");
                                break;
                            case "A":
                                firstPlayerScore.setText("40");
                                break;
                            case "0":
                                firstPlayerScore.setText("0");
                                break;
                            default:
                                int currentScore = Integer.parseInt((String) firstPlayerScore.getText());
                                firstPlayerScore.setText(String.valueOf(currentScore - 15));
                                break;
                        }
                    } else if (currentWinner==2) {
                        switch ((String) secondPlayerScore.getText()) {
                            case "40":
                                secondPlayerScore.setText("30");
                                break;
                            case "A":
                                secondPlayerScore.setText("40");
                                break;
                            case "0":
                                secondPlayerScore.setText("0");
                                break;
                            default:
                                int currentScore = Integer.parseInt((String) secondPlayerScore.getText());
                                secondPlayerScore.setText(String.valueOf(currentScore - 15));
                                break;
                        }
                        break;
                    }
                    currentPlayer.remove(0);

Проблема в том, что я, очевидно, сталкиваюсь с некоторыми проблемами java.util.ConcurrentModificationException, так как я изменяю Список.

Любой Советы, как это сделать?

Заранее спасибо, ребята - будьте в безопасности.

Тарифы

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Вы живете в современную эпоху, когда все происходит через веб-поиск. В частности, JavaSE чрезвычайно хорошо документирован по сравнению с некоторыми другими API. Это пустая трата, если вы решите не использовать его. Лучший совет, который я могу вам дать, если это звучит как проблема, которую кто-то в мире, вероятно, столкнулся бы с вами раньше, то, вероятно, она имеет смысл для поиска.

А пока этот ответ завершен, Iterator # remove () - это не то же самое, что List # remove (int) или List # remove (Object) .

  • Iterator # remove () - удалить первый элемент итератора, именно то, что вы просите.
  • List # remove (int) - удалить элемент с индексом, указанным параметром.
  • List # remove (Object) - удалить все объекты в списке, соответствующие параметру. Это тот метод, который вы вызываете.

Теперь я не совсем уверен, что ваши утверждения о вашем коде верны. Вы утверждаете, что все вхождения 0 удалены. Такого не должно быть. Что должно произойти, когда вы предоставляете примитив int, это удалить 0-й индекс списка. Если бы вы делали list.remove(new Integer(0)), тогда я ожидал бы поведение, которое вы описываете.

Другими словами, здесь не должно быть автобокса 0, потому что есть функция, которая ожидает примитив уже. См. Правильное удаление целого числа из списка (т.е. кто-то задал точный вопрос, который вы сейчас задаете, но задал его буквально 10 лет go)

0 голосов
/ 31 марта 2020

Что вы можете сделать, прежде чем создавать итератор, вы можете удалить первый элемент с индексом 0 и считать его победителем. Затем вы можете выполнить итерацию остальных и предположить, что они не являются победителями.

Исключение ConcurrentModificationException происходит из-за того, что вы пытаетесь изменить базовую коллекцию, из которой был создан Iterator, при выполнении итерации Iterator.

                Collections.reverse(currentPlayer);

                Integer winner = currentPlayer.remove(0);

                Iterator<Integer> iterator = currentPlayer.iterator();

                while (iterator.hasNext()) {
                    int nonWinner = iterator.next();

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