繁体   English   中英

使用“ Boolean equals()”比较保存在ArrayList中的对象

[英]Comparing Objects saved in ArrayList using “Boolean equals()”

我有一Class叫做Products 这个班有一个name和一个price 我可以通过以下方式创建产品:

Product book = new Product();
book.setName("book");
book.setPrice(3);

在那之后,我应该检查该产品是否已经存在于ArrayList我应该将其保存到,如果不存在,那么我就把它放在那里。 我应该使用以下方法做到这一点:

public boolean equals(Object obj){

}

问题是,如果要保存产品的ArrayListpublic static void main创建并初始化,而在ArrayList甚至不存在之前创建此boolean ,我该怎么办呢?

我应该像这样将Class本身设置为ArrayList吗?

public class ArrayList<Product>{
}

不用担心它的存在。 由于您要覆盖Product类中的equals方法,因此您可以尝试在下面执行此操作

if(yourArayList.contains(book)){
   // it existed in the list
 }else{
   yourArayList.add(book);
}

当您调用contains方法时,它会在内部调用Product方法的equals方法和传递给它的对象。

这个boolean是在ArrayList存在之前创建的吗?

您误解了equals工作方式。 除非您以某个对象作为参数调用它,否则它不会“创建” boolean ,并且会根据您传递的对象的属性返回一个boolean

当您定义equals方法时,您将提供代码来确定相等性,但是此时您尚未决定任何事情:

@Override
public boolean equals(Object obj){
    if (obj == this) return true
    if (!(obj instanceof Product)) return false;
    Product other = (Product)obj;
    if (!other.getName().equals(getName())) return false;
    if (!other.getPrice() == getPrice()) return false;
    return true;
}
@Override
public int hashCode() {
    return 31*getName().hashCode() + getPrice();
}

现在,如果列表以以下两种方式之一包含您的Product ,则可以使用equals进行判定:

  • 使用contains -此方法调用equals检查包含性,或者
  • 迭代所有对象,并手动调用equals

您不需要创建自己的ArrayList类。 如果实现平等权利,则在执行myList.contains(book)时将调用它以检查列表中是否包含它。

实际上,有一个结构可以让您跳过在代码中执行检查的过程。 您可以使用java.util.HashSet 它确保不能添加任何重复项。 另外,它返回布尔值,说明是否添加了元素。 例如

Set<Product> mySet = new HashSet<>(); 
boolean added = mySet.add(book);

请不要忘记容易遵循的规则-在定义等式时,也要定义hashCode。 如果使用IDE,则可以轻松生成它们。

在您的ArrayList存在之前不会创建此布尔值。

您需要像这样覆盖Product的equals()方法:

@Override
public boolean equals(Object obj) {
    if(obj == this) return true; // Both objects have the same reference -> the objects are equal
    if((obj == null) || (obj.getClass() != this.getClass())) return false; // Classes are different -> objects are different
    Product p = (Product) obj; // Cast obj into Product
    if( (this.getPrice() == p.getPrice()) && (this.getName().equals(p.getName())) ) return true; // Price and name are the same -> both products are the same
    return false; // At this point the two objects can't be equal
}

这是创建ArrayList的方法:

ArrayList<Product> products = new ArrayList<Product>();

这是当列表中不存在产品时您如何添加它的方法:

    if(!products.contains(yourProduct)){ // Checks if yourProduct is not contained in products
        products.add(yourProduct); // adds yourProduct to products
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM