Использование Contains для объектов в коллекции List - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь найти объект в коллекции List по его имени, используя метод Contains, но, так или иначе, он не работает.Как мне использовать это?

Вот как я пытаюсь использовать это

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 голосов
/ 14 октября 2018

Поскольку список содержит Candy объектов, для метода contains() требуется объект Candy для сравнения, поэтому вы не можете использовать contains("Caramel").

. Чтобы проверить, содержит ли списокCandy объект с name из "Caramel", вы можете использовать потоки Java 8+ для поиска:

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;
    }
}
0 голосов
/ 14 октября 2018

Переопределите метод 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
0 голосов
/ 14 октября 2018
Метод

getAllCandys() возвращает список Candy объектов.Вы должны посмотреть свойство каждого элемента name в списке.Таким образом, c является элементом списка candys.Используйте c.getName().contains("Caramel") для поиска "Caramel"

for(Candy c : candys) {
            System.out.println(c.getName() + " contains? " + c.getName().contains("Caramel"));
        }
0 голосов
/ 14 октября 2018

Вы должны переопределить метод 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, если имя совпадает.

...