Представьте класс Person с булевым флагом, указывающим, может ли человек использоваться - по умолчанию установлено значение false.Фильтрация с помощью таблиц истинности
public class Person{
boolean employable = false;
...
}
Теперь представьте себе, некоторые внешние логические методы, которые действуют на объекты Person. Например, рассмотрим статические логические методы в классе утилиты.
public class PersonUtil{
public static boolean ofWorkingAge(Person p){
if(p.getAge() > 16) return true;
return false;
}
...
}
Boolean статические методы, в сущности, аналогичные Булевозначный функции т.е. предикаты.
Мы можем построить предикат 2^(# предикатов) -by-# предикатов из предикатов. Например, если три предиката: ofWorkingAge, ofGoodCharacter, isQualified мы можем построить следующий 8-на-3 Таблица истинности:
T T T
T T F
T F T
T F F
F T T
F T F
F F T
F F F
Теперь мы хотим нанимать людей с желаемыми качествами. Пусть + указывают на то, что мы хотим рассмотреть возможность использования любого человека (т. Е. Установить свой флаг занятости на true) и - напротив.
T T T | +
T T F | +
T F T | +
T F F | -
F T T | +
F T F | -
F F T | -
F F F | -
Теперь представьте себе, что имеется коллекция объектов Person. Для каждого человека мы настраиваем свой флаг занятости в соответствии с тремя предикатами. Мы также обновить количество (это заставляет нас использовать всю таблицу истинности, а не только позитивы), так что данные 1000 человек, мы хотим, чтобы в конечном итоге что-то вроде:
T T T | + 100
T T F | + 200
T F T | + 50
T F F | - 450
F T T | + 50
F T F | - 50
F F T | - 50
F F F | - 50
Предположительно это можно думать как фильтрация с таблицами истинности. Установка флагов занятости и подсчет обновлений - довольно надуманный пример, но вы можете легко увидеть, как мы можем вместо этого устанавливать и обновлять гораздо более сложные вещи.
ВОПРОС
Есть ли способ сделать это элегантно? Я могу думать о двух решениях:
неуклюжего решения
Есть гигантскую руку кодированной, если, еще если, иначе цепи.
if(ofWorkingAge && ofGoodCharacter && isQualified){
c1++;
p.setEmployable(true)
}
else if(ofWorkingAge && ofGoodCharacter && !isQualified){
c2++;
p.setEmployable(true)
}
...
else if(!ofWorkingAge && !ofGoodCharacter && isQualified){
c7++;
}
else{
c8++;
}
Это просто плохо.
Слегка надежное решение
Pass предиката (возможно, в массиве) и набор предложений к способу. Пусть метод генерирует соответствующую таблицу истинности. Прокрутите людей, установите их возможности для трудоустройства и верните множество графов.
Я могу видеть, как это можно сделать с помощью функциональных интерфейсов. This SO answer потенциально имеет значение.Вы можете изменить PrintCommand до IsQualified и пройти callCommand a Лицо вместо строки. Но это также кажется добрым неуклюжим, потому что тогда у нас должен быть новый файл интерфейса для каждого предиката, который мы придумаем.
Есть ли какой-либо другой способ 8-ий Java Java?
ли желаемый результат таблица истинности со счетчиком для каждой строки? Или же желаемый результат, что все объекты 'Person' имеют правильно установленный флаг' useable', заданный произвольным числом предикатов? –
Оба одновременно. :) Учитывая произвольное количество предикатов, правильно установите подходящий флаг и верните таблицу истинности со счетом для каждой строки. –
Сколько предикатов нужно оценивать как истинное для «Человека», которое можно использовать? –