Поиск в коллекции по одному или нескольким полям Java

223
13 августа 2017, 05:45

Делаю реализацию магазина цветов. Есть склад - List plantStorage, в котором хранятся цветы - объекты Plant с полями: name, color, length, freshness, price. Неодходимо реализовать поиск в PlantStorage цветка plantToSearch по заданым пользователем полям. Причем, пользователь может не указывать все поля для поиска, а указать только несколько, какие ему нужно. Например name и color, а остальные условия поиска будут null. В этом случае необходимо сделать список цветов, которые подходят по параметрам поиска.

Была идея сделать так:

List<Plant> foundFlowers = new LinkedList<>();
    for (Plant plant : plantStorage) {
        if (((plantToCompare.getColor() != null && plantToCompare.getColor().equals(plant.getColor())) &&
                (plantToCompare.getName() != null && plantToCompare.getName().equals(plant.getName())) &&
                (plantToCompare.getLength() != null && plantToCompare.getLength() == ((Flower) plant).getLength()) &&
                (plantToCompare.getFreshness() != null && plantToCompare.getFreshness() == plant.getFreshness()) &&
                (plantToCompare.getPrice() != null && plantToCompare.getPrice() == plant.getPrice()))) {
            foundFlowers.add(plant);
        }
    }

}

но это не работает... Помогите, пожалуйста.

Answer 1

В данный момент у тебя выполниться поиск, если только введены все условия, поскольку везде стоят &&. Вначале необходимо проверить, какие строки не null, а после уже по ним производить поиск. Есть следующий вариант. Вначале надо ещё проверку что все поля у сравниваемого не null.

boolean found=true;
if (plantToCompare.getColor() != null) {
   if (!(plantToCompare.getColor().equals(plant.getColor())))
      found=false;
}
.....повторяем для каждого поля....
if (found==true)  foundFlowers.add(plant);
Answer 2

у plantToCompare задайте начальные значения всех параметров. Допустим для color = "null" именно текстом (чтобы не ловить NPE), для цифровых значений -1.

А дальше использовать лямбды

READ ALSO
SetOnKeyTyped - как реализовать в javafx?

SetOnKeyTyped - как реализовать в javafx?

Здраствуйте! Подскажите как в javaFX сделать обработку нажатия(type) клавиши, те

178
Float округление

Float округление

Нужно в приложении вычеслить разность 2х чисел2 floata , ответ получаю типо 1

255
Криво работает жизненный цикл Activity

Криво работает жизненный цикл Activity

Я нахожусь в WatchVideoActivityВызывается

171