Создание маски из выбранных дней недели (MTWTFSS), чтобы определить, соответствует ли определенный c день только с помощью операторов basi c - PullRequest
1 голос
/ 17 марта 2020

Учитывая выбор дней недели, мне нужно знать, совпадает ли указанный c день с выбором.

Например, задано:

enum DayOfWeek {
    MON, TUE, WED, THU, FRI, SAT, SUN
}

И следующее выбор:

List<DayOfWeek> selection = List.of(MON, WED);

Если день недели данного дня равен MON или WED, то он должен совпадать, иначе не должен.

Простой подход:

boolean match = selection.contains(day.getDayOfWeek());

Мне интересно, есть ли способ создать маску из выбора и определить, совпадает ли данный день только с базовыми c операторами (+ - * / % AND OR NOT EQ LT LTE GT GTE, битовые операторы не допускаются).

Например, при том же выборе:

int mask = 1010000; // just an example of a mask, can be any other

Тогда:

boolean match = fn(mask, day.getDayOfWeek());

Может ли существовать такой mask, чтобы можно было записать fn с базисом c только для операторов?

1 Ответ

2 голосов
/ 18 марта 2020

Вместо логического подхода возьмите несколько простых чисел

MON, TUE, WED, THU, FRI, SAT, SUN
2,   3,   5,   7,   11,   13,  17

Маска составлена ​​из произведения выбранного дня, например, (MON, WED) -> 2*5 = 10

DayOfWeek соответствует тогда, когда оно делит маска (то же самое mask % dayOfWeek === 0)

например

  • TUE -> 3, mask % 3 != 0, без выбора
  • MON -> 2, mask % 2 === 0, с выбором
...