как выполнить поиск по ключевым словам в списке объектов Java, сопоставленных со всеми членами объекта Java - PullRequest
1 голос
/ 07 ноября 2019

У меня есть List<Employee>, который содержит несколько членов, таких как идентификатор, имя, обозначение, уровень, роль, домен, учетная запись и т. Д. Я хочу найти ключевое слово среди всех членов Employee во всем списке и вернутьсписок, содержащий все совпадающие экземпляры Employee.

Вот пример моего Employee класса:

public class Employee
{
    public String name { get; set; }
    public String email { get; set; }
    public String designation{ get; set; }
    public String level { get; set; }
    public String domain { get; set; }
    public String role { get; set; }
}

Больше похоже на поиск по ключевым словам на любом сайте электронной коммерции, например, Walmart или Amazon.

Я не знаюне хочу писать серию операторов if в цикле для сопоставления с каждым членом. Я думаю, что один из способов - создать еще одну строку, содержащую объединенное значение каждого члена в объекте Employee, а затем использовать потоки Java 8 для выполнения поиска, но я думаю, что был бы лучший способ. Есть еще предложения?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Мое предложение было бы разработать именно то, что вам нужно, а именно список терминов для поиска. Конечно, вам нужно написать немного скучного кода, чтобы поместить ваш объект в список терминов, но вам нужно сделать это только один раз, и тогда у вас будет чистый дизайн.

Для удобства вы можете даже добавить обратную ссылку к вашему Employee объекту.

Например:

interface Term {
    String text();
    Employee employee();
}

Затем внутри класса Employee:

// Create an anonymous class instance of interface Term
private Term createTerm(String text) {
    return new Term() {
        public String text() { return text; }
        public Employee employee() { return Employee.this; }
    };
}

// Create list of terms for this object
public List<Term> terms() {
    return Arrays.asList(
        createTerm(getName()),
        createTerm(getEmail()),
        createTerm(getLevel())); // and so on
}

При такой настройке выполнение запросов, которые вы описываете с использованием потоков, становится очень простым. Например:

Set<Employee> result = employees
    .stream()
    .flatMap(employee -> employee.terms().stream())
    .filter(term -> term.text().equals("???"))
    .map(Term::employee)
    .collect(Collectors.toSet());
0 голосов
/ 07 ноября 2019

Вы можете использовать reflection для циклического перебора всех полей и сравнения значений, поэтому создайте этот метод в Employee class:

public class Employee{

/* Instance Members */

public boolean checkMatch(String keyword) throws IllegalAccessException {
    for(Field field: this.getClass().getDeclaredFields()){
        String value = (String) field.get(this);
        if(value.equalsIgnoreCase(keyword))
            return true;
    }
   return false;
}

}

USAGE:

public static void main(String[] args) throws IllegalAccessException {
    List<Employee> employees = new ArrayList<>();
    String keyword = "Research";
    employees.add(new Employee("john","john@doe.com","Manager","3rd","Research","Senior"));
    for(Employee e: employees){
        if(e.checkMatch(keyword)){
            System.out.println("Yayy! Record Found");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...