Элемент пропадает во время итерации Arraylist - PullRequest
1 голос
/ 18 июля 2010

Может кто-нибудь объяснить мне, что не так с приведенным ниже фрагментом кода?

public static void main(String[] args) {
 List<String> l = new ArrayList<String>();
  l.add("1");
  l.add("2");
  l.add("3");
  l.add("4");

  for (int i = 0; i < l.size(); i++) {
   if(l.get(i).equals("1"))
    l.remove(l.get(i));
   else
    System.out.println(l.get(i));
  }
 }

дает мне вывод [3.4] вместо [2,3,4].?Я все еще путаюсь с этим поведением Списка .. Здорово, если кто-нибудь сможет объяснить ..

Заранее спасибо :))

Ответы [ 4 ]

5 голосов
/ 18 июля 2010

Причина:
Когда я = 0, вы удаляете первый элемент, и я становится 1
Когда я = 1, теперь вы находитесь на третьем элементе, потому что вы сместили все на 1, поэтому пишете «3»
Когда я = 2, вы пишете третий элемент, который "4"

Дает вам вывод "3", "4"

Альтернативная реализация может быть:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Item {
    public static void main(String[] args) {
        List<String> l = new ArrayList<String>();
        l.add("1");
        l.add("2");
        l.add("3");
        l.add("4");

        Iterator<String> iter = l.iterator();
        while(iter.hasNext())
        {
            String value = iter.next();
            if("1".equals(value))
            {
                iter.remove();
            }
            else
            {
                System.out.println(value);
            }
        }
    }
}
2 голосов
/ 18 июля 2010

После вызова l.remove текущий элемент (l.get(i)) становится следующим элементом ("2").
Однако после вызова remove вы продолжаете цикл и заканчиваете тем, что пропускаете элемент.

Чтобы исправить это, вы можете добавить i-- внутри if, чтобы новый текущий элемент обрабатывался следующей итерацией (после i++)

1 голос
/ 18 июля 2010

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

int i=0;
while(i < l.size())
{
  if(l.get(i).equals("1"))
    l.remove(l.get(i));
  else
  {
    System.out.println(l.get(i++));
  }
}
0 голосов
/ 04 апреля 2012

Если вы возьмете другое, это даст вам желаемую функциональность.

List<String> l = new ArrayList<String>();
l.add("1");
l.add("2");
l.add("3");
l.add("4");

for (int i = 0; i < l.size(); i++) {

    if(l.get(i).equals("1"))
        l.remove(l.get(i));

    System.out.println(l.get(i));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...