2014-11-20 2 views
0

скажем, у нас есть аа класс Карандаш, который имеет два атрибута, как это:удалить объект из списка

public class Pencil { 
    String color; 
    int length; 

    public Pencil(String c, int sh, int l) { 
     this.color = c; 
     this.length = l; 
    } 
    public String getColor() { 
     return color; 
    } 
} 

затем положить объект 4 карандаша в коробке:

public class Box { 

    ArrayList<Pencil> list; 
    public Box() { 
     list = new ArrayList<Pencil>(); 
     list.add(new Pencil("blue", 5, 10)); 
     list.add(new Pencil("black", 5, 10)); 
     list.add(new Pencil("brown", 5, 10)); 
     list.add(new Pencil("orange", 5, 10)); 
    } 
} 

, а затем мы чтобы удалить один из этих объектов из списка на основе стоимости color:

public class TestDrive { 
    public static void main(String[] args) { 
     Box b = new Box(); 
     ArrayList box = b.list;   
     Iterator it = box.iterator(); 
     while(it.hasNext()) { 
      Pencil p = (Pencil) it.next(); 
      if (p.getColor() == "black") { 
       box.remove(p); 
      } 
     } 
    } 
} 

кажется довольно ес'и ghtforward, но я получаю Exception in thread "main" java.util.ConcurrentModificationException. Я был бы признателен, если бы кто-нибудь мог сказать, что мне здесь не хватает

+0

Там же несколько вопросов здесь ... и чтобы отразить любые потенциальные боян-доводчик, он не чувствует, как он вписывается в «сравнить строки» или «одновременно модификация» вопросы. – Makoto

+0

Посмотрите на это: http://stackoverflow.com/questions/8189466/java-util-concurrentmodificationexception –

+0

@chrylis: Вопрос, заданный в связанном дубликате, имеет иной характер, чем тот, который здесь задан. Я не чувствую, что это дублирующий вопрос. – Makoto

ответ

3

У вас есть две проблемы.

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

Чтобы удалить элемент, в котором вы сейчас находитесь, вы должны использовать it.remove().

Далее вы сравниваете строки с == - это не гарантировано для работы вообще. Вместо этого вы должны использовать .equals.

Обращайте внимание на то, что вы сравниваете их с тем, чтобы у вас не было шансов получить NullPointerException.

Вот что выглядит блок, пересматривается.

public static void main(String[] args) { 
    Box b = new Box(); 
    ArrayList<Pencil> box = b.list; 
    for(Iterator<Pencil> it = box.iterator(); it.hasNext();) { 
     Pencil p = it.next(); 
     if ("black".equals(p.getColor())) { 
      it.remove(); 
     } 
    } 
} 
Смежные вопросы