Я хочу удалить / удалить объект из списка объектов массива. Сработало бы это, если бы мой класс был:

class bookings {
  public String getuser () {
    return user;
  }

  public Date getbooking() {
    return bookingDate;
  }

  private String user;
  private Date bookingDate;
}

И у меня был Arraylist, похожий на:

ArrayList <bookings> book;


public void foo (String user, Date date) {
  for (bookings b : book) {
    if (user.equals(b.getuser()) && date.equals(g.getbooking()) book.remove(b);
  }
}
1
FHr 28 Авг 2011 в 06:55

3 ответа

Лучший ответ

Во-первых, вы не можете использовать цикл foreach for (bookings b : book), потому что он не позволит вам изменить коллекцию (это вызовет исключение).

Этот код должен работать:

public void foo (String user, Date date) {
  for (Iterator<bookings> i = book.iterator(); i.hasNext();) {
    bookings b = i.next(); // Oops - forgot this line!
    if (user.equals(b.getuser()) && date.equals(b.getbooking())
        i.remove(); // Corrected this too!
  }
}

Было бы неплохо называть вещи, используя стандартные соглашения об именах и использование заглавных букв:

class Booking {
    String getUser() ...
    Date getDate() ...
}

ArrayList<Booking> bookings;
2
Bohemian 28 Авг 2011 в 04:18

FHr, по-твоему будет проблема.

java.util.ConcurrentModificationException

Это означает, что вы одновременно изменяете свою коллекцию как в цикле, так и в удалении.

Если вы хотите узнать основную причину возникновения ошибки.

Вам лучше заглянуть в этот пост

Почему java.util.Collection не определяет next (), hasNext () напрямую?

Поэтому используйте вместо этого Iterator.

 Iterator it = list.iterator();
        while(it.hasNext()){
            Object o = it.next();

            //check your object here such as equals, 
            //the safe way is to use Iterator here.
            it.remove();
        }

Вы можете реорганизовать его, набрав в итераторе бронирования, например Iterator<bookings>

1
Community 23 Май 2017 в 11:43

Проверьте это: Интерфейс коллекции

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

0
xdazz 28 Авг 2011 в 03:27