【问题标题】:Java: RemoveAll(Collection c) returns falseJava:RemoveAll(Collection c) 返回 false
【发布时间】:2018-05-17 21:56:57
【问题描述】:

在我的Java代码中,我有两个arrayList,一个是assignedRiders,另一个是nearestRiders,如果nearestRiders列表中也存在assignedRiders中的元素,我想删除它,为此我使用了以下行,但是当我运行它时,即使它们具有相同的元素,它也会返回 false

代码

List<User> nearestRiders=new ArrayList<User>();
List<User> assignedRiders=new ArrayList<User>();
nearestRiders=riderLocationRepo.findNearestRiderList(orderRequest.getLatitudeShop(),
                    orderRequest.getLongitudeShop());
assignedRiders=orderAlredayAssigned();
Boolean dataChanhged=nearestRiders.removeAll(assignedRiders);

【问题讨论】:

  • 你的 User 类是否覆盖了 equals 和 hashcode?​​span>
  • @OHGODSPIDERS 不
  • 因为移除、removeAll、包含等List操作都使用equals方法判断两个元素是否相同。
  • 如果您不实现这些方法,您的两个用户列表将使用内存地址进行比较,而不是它们的值。因此,例如,如果您的 orderAlreadyAssigned() 方法将访问数据库,而您的nearestRiders 来自文件(例如),则常见的骑手实际上是同一个对象,只是具有相同的值。

标签: java list collections removeall


【解决方案1】:

你可以这样做:

for(User u : nearestRiders){
assignedRRiders.remove(u)}

【讨论】:

    【解决方案2】:

    如果这些列表中的对象具有相等的值,则它们不一定相等。

    removeAll 的源代码

    public boolean removeAll(Collection<?> c) {
        boolean modified = false;
        Iterator<?> e = iterator();
        while (e.hasNext()) {
            if (c.contains(e.next())) {
                e.remove();
                modified = true;
            }
        }
        return modified;
    }
    

    它调用contains,它调用equalTo。这意味着您可以在您尝试删除的对象的类中覆盖 equalTo 以检查特定值,例如 GUID。

    【讨论】:

      猜你喜欢
      • 2017-10-10
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      相关资源
      最近更新 更多