Как организовать поиск по полям класса в java?

Есть код на java:
worker.java

package com.company;

public class Worker {
    public String name = "Default";
    public int age;
    public int salary;

    public void setName(){ this.name = name; }
    public String getName(){
        return name;
    }
    public void setAge(){
        this.age = age;
    }
    public int getAge(){
        return age;
    }
    public void setSalary(){ this.salary = salary; }
    public int getSalary(){
        return salary;
    }

}

worker1.java

package com.company;

public class Worker1 extends Worker{
    public void checkAge(){
        if (age > 0 && age < 100) {
            this.age = age;
        }
        System.out.println(age);
    }
}

main.java

public class Main {

    public static void main(String[] args) {
        Worker2 firstWorker = new Worker2();
        firstWorker.salary = 12000;
        firstWorker.age = 25;
        firstWorker.name = "Ivan";

        Worker2 secondWorker = new Worker2();
        secondWorker.salary = 9800;
        secondWorker.age = 22;
        secondWorker.name = "Sergey";

        Worker2 thirdWorker = new Worker2();
        thirdWorker.salary = 54000;
        thirdWorker.age = 48;
        thirdWorker.name = "Artem";
}
}

worker2.java

package com.company;

public class Worker2 extends Worker1{
    public void checkSalary(){
        if (salary > 0) {
            System.out.println("Зарплата " + name + " - положительное число");
        } else System.out.println("Зарплата " + name + "  - отрицательное число");
        if (salary > 12038) {
            System.out.println("Зарплата " + name + "  выше прожиточного минимума");
        } else System.out.println("Зарплата " + name + "  ниже прожиточного минимума");
            if (salary < 100000) {
            System.out.println("Зарплата " + name + "  ниже предельного числа");
        } else System.out.println("Зарплата " + name + "  выше предельнего числа");
    }
}

Задание: Обеспечить возможность поиска в списке по различным полям (имя. возраст, диапазон зарплат). Не могу реализовать это, не подскажете, как сделать?


Ответы (1 шт):

Автор решения: Дмитрий

что-то у вас все плохо, включая даже сеттеры)) попробуйте так:

public class Worker {

    private final String name;
    private final int age;
    private final int salary;

    public Worker(String name, int age, int salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public int getSalary() {
        return salary;
    }

    @Override
    public String toString() {
        return "Worker{" + "name=" + name + ", age=" + age + ", salary=" + salary + '}';
    }
    
}

import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

public class WorkerSearcher {
    
    private String name;
    private Integer minAge;
    private Integer maxAge;
    private Integer minSalary;
    private Integer maxSalary;
        
    public WorkerSearcher setName(String name) {
        this.name = name;
        return this;
    }

    public WorkerSearcher setMinAge(Integer minAge) {
        this.minAge = minAge;
        return this;
    }

    public WorkerSearcher setMaxAge(Integer maxAge) {
        this.maxAge = maxAge;
        return this;
    }

    public WorkerSearcher setMinSalary(Integer minSalary) {
        this.minSalary = minSalary;
        return this;
    }

    public WorkerSearcher setMaxSalary(Integer maxSalary) {
        this.maxSalary = maxSalary;
        return this;
    }
    
    public List<Worker> search(Collection<Worker> workers) {
        return workers.stream()
                .filter(worker->name == null || worker.getName().equals(name))
                .filter(worker->rangeOf(worker.getAge(), minAge, maxAge))
                .filter(worker->rangeOf(worker.getSalary(), minSalary, maxSalary))
                .collect(Collectors.toList());
    }
    
    private boolean rangeOf(Integer value, Integer min, Integer max) {
        if (min==null && max==null) return true;
        if (min!=null && max==null && min<=value) return true;
        if (max!=null && min==null && max>=value) return true;
        if (max!=null && min!=null && max>=value && min<=value) return true;
        return false;
    }
    
}

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        
        List<Worker> workers = new ArrayList<>();
        
        workers.add(new Worker("Ivan", 25, 12000));
        workers.add(new Worker("Sergey", 22, 9800));
        workers.add(new Worker("Artem", 48, 54000));
        
        List<Worker> result = new WorkerSearcher()
                .setMinSalary(10000)
                .setMaxAge(40)
                .search(workers);
        
        System.out.println(result);
        
    }

}

Класс WorkerSearcher одновременно является шаблоном для поиска и поисковиком. Вы создаете экземпляры данного класса и добавляете все условия поиска, после чего вызываете метод search, передавая в аргументы коллекцию, по которой хотите выполнить поиск. Возвращается вам коллекция уже отфильтрованная (результаты поиска). В примере я ищу работников с минимальной зарплатой 10000 и максимальным возрастом 40 и результат вывожу в консоль. Не очень практично, но для учебного примера вполне...

→ Ссылка