为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

烙印99 2021-11-17 15:12:58
我正在尝试使用 Contains 方法按他的名字在 List 集合中找到一个对象,但不知何故,它不起作用。我应该如何使用它?这就是我尝试使用它的方式CandyDao.getAllCandys().contains("Caramel")但它找不到我需要的对象。CandyDao.javapublic 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;  }}
查看完整描述

3 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

由于列表包含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()) {

    if ("Caramel".equals(candy.getName())) {

        hasCaramel = true;

        break;

    }

}


查看完整回答
反对 回复 2021-11-17
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

覆盖equals&hashcode方法如下:


@Override

public boolean equals(Object o) {

    if (this == o) return true;

    if (o == null || getClass() != o.getClass()) return false;

    Candy candy = (Candy) o;

    return Objects.equals(name, candy.name);

}


@Override

public int hashCode() {

    return Objects.hash(name);

}

现在,由于 equals 函数只检查Candy对象的名称是否相等,因此以下应该起作用:


CandyDao.getAllCandys().contains(new Candy("Caramel", 0, true)) .   //2nd & 3rd arg of Candy constructor are inessential/dummy



查看完整回答
反对 回复 2021-11-17
?
萧十郎

TA贡献1815条经验 获得超12个赞

您应该覆盖该Object#equals方法,Candy如下所示:


@Override

public boolean equals(Object o) {

    if (!(o instanceof Candy)) {

        return false;

    }


    Candy that = (Candy) o;


    return Objects.equals(that.getName(), this.getName());

}

覆盖后,如果名称匹配,List#contains则应返回true。


查看完整回答
反对 回复 2021-11-17
  • 3 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信