猿问

对 List 集合中的对象使用包含

我正在尝试使用 Contains 方法按他的名字在 List 集合中找到一个对象,但不知何故,它不起作用。我应该如何使用它?


这就是我尝试使用它的方式


CandyDao.getAllCandys().contains("Caramel")

但它找不到我需要的对象。


CandyDao.java


public class CandyDao {

  private List<Candy> candys = Arrays.asList(new Candy("Caramel", 3, false),

          new Candy("Marmelade", 2, true));


  public List<Candy> getAllCandys(){

    return candys;

  }

}

Candy.java


  public class Candy {

  private String name;

  private float price;

  private boolean InStock;


  public Candy() {

  }


  public Candy(String name, float price, boolean InStock) {

    setName(name);

    setPrice(price);

    setInStock(InStock);

  }


  public String getName() {

    return name;

  }


  public void setName(String name) {

    this.name = name;

  }


  public float getPrice() {

    return price;

  }


  public void setPrice(float price) {

    this.price = price;

  }


  public boolean getInStock() {

    return InStock;

  }


  public void setInStock(boolean InStock) {

    this.InStock = InStock;

  }

}


烙印99
浏览 122回答 3
3回答

猛跑小猪

由于列表包含Candy对象,该contains()方法需要一个Candy对象进行比较,因此不能使用contains("Caramel").要检查列表是否包含Candy带有nameof的对象"Caramel",您可以使用 Java 8+ Streams 进行搜索:CandyDao.getAllCandys().stream().Map(Candy::getName).anyMatch("Caramel"::equals);等效的非流版本将是:boolean hasCaramel = false;for (Candy candy : CandyDao.getAllCandys()) {&nbsp; &nbsp; if ("Caramel".equals(candy.getName())) {&nbsp; &nbsp; &nbsp; &nbsp; hasCaramel = true;&nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; }}

开心每一天1111

覆盖equals&hashcode方法如下:@Overridepublic boolean equals(Object o) {&nbsp; &nbsp; if (this == o) return true;&nbsp; &nbsp; if (o == null || getClass() != o.getClass()) return false;&nbsp; &nbsp; Candy candy = (Candy) o;&nbsp; &nbsp; return Objects.equals(name, candy.name);}@Overridepublic int hashCode() {&nbsp; &nbsp; return Objects.hash(name);}现在,由于 equals 函数只检查Candy对象的名称是否相等,因此以下应该起作用:CandyDao.getAllCandys().contains(new Candy("Caramel", 0, true)) .&nbsp; &nbsp;//2nd & 3rd arg of Candy constructor are inessential/dummy

萧十郎

您应该覆盖该Object#equals方法,Candy如下所示:@Overridepublic boolean equals(Object o) {&nbsp; &nbsp; if (!(o instanceof Candy)) {&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }&nbsp; &nbsp; Candy that = (Candy) o;&nbsp; &nbsp; return Objects.equals(that.getName(), this.getName());}覆盖后,如果名称匹配,List#contains则应返回true。
随时随地看视频慕课网APP

相关分类

Java
我要回答