对列表集合中的对象使用包含

时间:2018-10-14 14:50:17

标签: java list collections contains

我正在尝试使用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;
  }
}

4 个答案:

答案 0 :(得分:3)

由于列表包含Candy个对象,因此contains()方法需要一个Candy对象进行比较,因此您不能使用contains("Caramel")

要检查列表中是否包含Candyname的{​​{1}}对象,可以使用Java 8+ Streams进行搜索:

"Caramel"

等效的非流版本为:

CandyDao.getAllCandys().stream().Map(Candy::getName).anyMatch("Caramel"::equals);

答案 1 :(得分:2)

覆盖equalshashcode方法,如下所示:

@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

答案 2 :(得分:0)

您应覆盖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

答案 3 :(得分:0)

getAllCandys()方法返回Candy个对象的列表。您应该在列表中查找每个元素的name属性。因此ccandys列表的元素。使用c.getName().contains("Caramel")查找"Caramel"

for(Candy c : candys) {
            System.out.println(c.getName() + " contains? " + c.getName().contains("Caramel"));
        }