Проблемы с логическими значениями для выбора

Я пытаюсь реализовать что-то довольно простое (в принципе), но у меня есть некоторые проблемы с реализацией.

В моей программе пользователь должен выбрать от 1 до 4 направлений, которые должны быть исключены. Для каждого направления пользователь может выбрать диапазон номеров для исключаемых значений (от 0 до 360). Но почему-то я не могу понять, как сделать это простым способом.

Моя панель выглядит так: А)

Вот короткий пример того, чего я пытаюсь достичь.

Я хочу тот же результат для этого: B)

Что касается этого (но это должно работать для всех 4 случаев, конечно): C)

У вас есть идеи, как решить эту проблему? Или какие-то намеки? Любая помощь будет оценена.(Если вы хотите, чтобы я предоставил код, который я попробовал, я сделаю).

Редактировать: Окей, вы хотели немного кода, вот что я сделал (но он работает не так, как я хочу).

content [i].getNwdMean () - это значение, которое я хочу сравнить с значениями в счетчиках, чтобы увидеть, находится ли моя точка в зоне исключения.

buttons.chkExcludedA1, buttons.chkExcludedA2, buttons.chkExcludedA3 и buttons.chkExcludedA4 являются кнопками для указания направлений для исключения.

buttons.getDir1A (), getDir2A, getDir3A, getDir4A, getDir1B, getDir2B, getDir3B, getDir4B - это значения, хранящиеся в счетчиках, в моем примере C), getDir1A = 180, getDir1B = 190; getDir2A = 190 и getDir2B = 200.

    // Is supposed to check the interval in both sides.
public static boolean isBetween(double x, double a, double c)
{
    return(x > (a < c ? a : c) && x < (a > c ? a : c));
}

private boolean parsDirections(boolean state)
{
   boolean a1 = false, a2 = false, a3 = false, a4 = false;
   if (buttons.chkExcludedA1 == true || buttons.chkExcludedA2 == true ||  buttons.chkExcludedA3 == true || buttons.chkExcludedA4 == true)
    {
        if (isBetween(content[i].getNwdMean(), buttons.getDir1A(), buttons.getDir1B()) == false)
        {
            a1 = true;
        }
        else if (isBetween(content[i].getNwdMean(), buttons.getDir2A(), buttons.getDir2B()) == false)
        {
            a2 = true;
        }
        else if (isBetween(content[i].getNwdMean(), buttons.getDir3A(), buttons.getDir3B())== false)
        {
            a3 = true;
        }
        else if (isBetween(content[i].getNwdMean(), buttons.getDir4A(), buttons.getDir4B()) == false)
        {
            a4 = true;
        }
    }
            // Basic test to see if it prints what i want, but it doesn't.
    if (a4 == true && a2 == true)
    {
        print(state);
    }
    else if (a1 == true && a2 == false)
    {
        print(state);
    }
    else 
    {
        return state;
    }
    return state;
}

3 ответа

Решение

Вы должны проверить человека chkExcludedAXв каждом операторе if (среди прочих вопросов с вашей логикой).

Попробуйте что-то вроде:

boolean excluded1 = buttons.chkExcludedA1 &&
    isBetween(content[i].getNwdMean(), buttons.getDir1A(), buttons.getDir1B()));
boolean excluded2 = buttons.chkExcludedA2 &&
    isBetween(content[i].getNwdMean(), buttons.getDir2A(), buttons.getDir2B()));
boolean excluded3 = buttons.chkExcludedA3 &&
    isBetween(content[i].getNwdMean(), buttons.getDir3A(), buttons.getDir3B()));
boolean excluded4 = buttons.chkExcludedA4 &&
    isBetween(content[i].getNwdMean(), buttons.getDir4A(), buttons.getDir4B()));

boolean excluded = (excluded1 || excluded2 || excluded3 || excluded4);

(предпочтение удобочитаемости выше того, что может быть микрооптимизацией)

Или вы можете объединить их все в одно утверждение:

boolean excluded =
  (buttons.chkExcludedA1 &&
   isBetween(content[i].getNwdMean(), buttons.getDir1A(), buttons.getDir1B())) ||
  (buttons.chkExcludedA2 &&
   isBetween(content[i].getNwdMean(), buttons.getDir2A(), buttons.getDir2B())) ||
  (buttons.chkExcludedA3 &&
   isBetween(content[i].getNwdMean(), buttons.getDir3A(), buttons.getDir3B())) ||
  (buttons.chkExcludedA4 &&
   isBetween(content[i].getNwdMean(), buttons.getDir4A(), buttons.getDir4B()));

Я предполагаю, что у вас есть кнопка или что-то, чтобы пользователь подтвердил свой выбор. Этот выбор должен затем вызвать ActionListeners actionPerformed метод, в котором вы должны обеспечить доступ к различным элементам пользовательского интерфейса.

Внутри действия "Выполненный метод" я не стал бы беспокоиться о конкретных выборках, если бы это не было абсолютно необходимо, вместо этого я просто сделал бы две вещи (это предполагает очень простой случай):

Для любого выбранного флажка (Направление 1-4)....

1.) ... получить соответствующие начальные значения, определить самое низкое значение 2.) ... получить соответствующие конечные значения, определить самое высокое значение 3.) Исключить все значения между самым низким и самым высоким значением

Таким образом, вам не нужно заботиться о различных значениях, которые могут перекрываться. Однако, если вы хотите иметь возможность исключать сегменты и при этом не беспокоиться о перекрытии, вам придется сделать что-то вроде этого:

Для любого выбранного флажка (Направление 1-4)....

1.) ... получить соответствующие начальные / конечные значения 2.) ... вызвать метод для добавления чисел, которые должны быть исключены, в массив, передающий начальные / конечные значения 3.) ... посмотреть метод на текущий массив чисел, чтобы проверить, включены ли начальные / конечные значения или значения между ними, если у этого метода нет добавления значений 4.) ... Используйте подготовленный массив из этого метода

Это будет более вероятным, если, например, вы хотите исключить диапазон 100-200 и 400-500, но при этом включить 201-399.

Не стесняйтесь предоставлять свой код, чтобы мы лучше понимали, в какой форме вам нужно это исключение (например, просто числа в массиве, минимальное / максимальное значение или собственный тип данных Range или что-то в этом роде).

В вашем коде невозможно добиться этого требования a4 == true && a2 == true потому что у вас есть такой код

boolean a1 = false, a2 = false, a3 = false, a4 = false;

if (a) {
    a1 = true;
} else if (b) {
    a2 = true;
} else if (c) {
    a3 = true;
} else if (d) {
    a4 = true;
}

Только один aX может быть установлен в true.

Если a && b && c && d == true затем (a1 = true) && (a2 && a3 && a4 == false)

Другие вопросы по тегам