【问题标题】:Java removing an object from an array listJava从数组列表中删除一个对象
【发布时间】:2011-11-05 08:00:58
【问题描述】:

我想从对象数组列表中删除/移除一个对象。如果我的班级是:

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

  public Date getbooking() {
    return bookingDate;
  }

  private String user;
  private Date bookingDate;
}

我有一个类似的数组列表:

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);
  }
}

【问题讨论】:

  • @xdazz 是的,我已经尝试过这样做,但当我尝试 system.out.println(b.getUser()) 时,列表中的对象仍然会被打印出来
  • b 仍然存在,但不会在 book 数组列表中。
  • 类名总是以大写字母开头,你的基础越扎实你就会成为更好的程序员,千万不要用复数形式的类名。它应该是“预订”而不是“预订”

标签: java arraylist


【解决方案1】:

首先,您不能使用 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;

【讨论】:

  • b 对象在此未定义,我是否将其替换为 i
  • @Clark @Bohemian 我将如何定义我?我试过 (bookings) i 但这对我来说是个错误
  • @FHr 你看到我的例子了吗?您需要尝试 (booking)i.next();并且可以在此处省略预订。
  • @Bohemian 我试过你的方法。使用 book.remove(b) 会导致 java.util.ConcurrentModificationException!我不会投反对票。但会造成误导。
【解决方案2】:

FHr, 你的方式会有问题。

java.util.ConcurrentModificationException

这意味着您在循环和删除中同时修改您的集合。

如果您想知道错误发生的根本原因。

你最好看看这篇文章

Why doesn’t java.util.Collection define next(), hasNext() directly?

所以请改用迭代器。

 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&lt;bookings&gt;

【讨论】:

  • 我试过这种方式,当我在 it.remove() 前后放置两个 System.out.println() 时,它表明它没有被删除
  • "会有问题" -- 什么问题?
  • if (user.equals(b.getuser()) &amp;&amp; date.equals(g.getbooking()) { System.out.println(b.getUser()); book.remove(b); System.out.println(b.getUser()); }
  • @FHr 您需要打印出列表而不是 b。您的目标是从书中删除 b。
  • @Clark Ba​​o 是的,我已经说过了。你声称他的代码有问题,但没有说它是什么。
【解决方案3】:

请检查:The Collection Interface

请注意,Iterator.remove 是在迭代期间修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改底层集合,则行为未指定。

【讨论】:

    猜你喜欢
    • 2016-03-30
    • 2016-11-14
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2021-07-11
    • 2020-11-07
    相关资源
    最近更新 更多