【问题标题】:Problems with booleans for a selection选择的布尔值问题
【发布时间】:2013-11-28 15:50:51
【问题描述】:

我正在尝试实现一些非常简单的东西(原则上),但我在实现方面遇到了一些麻烦。

在我的程序中,用户必须在 1 到 4 个方向之间进行选择,这些方向应被排除在外。 对于每个方向,用户可以为要排除的值选择一个数字范围(从 0 到 360)。 但不知何故,我无法弄清楚如何以简单的方式做到这一点。

我的面板是这样的:A)

这是我想要实现的一个简短示例。

我想要同样的结果: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;
}

【问题讨论】:

  • 所以把代码放在这里。 ;)
  • @user2172816 是的,我确保了这一点,如果您取消选中方向 1,它将禁用所有其他方向,直到您再次选中 1 :)
  • 这段代码可不简单,有没有想过为此写测试代码?
  • @MariuszS 英语不是我的母语 :S 你说的不是微不足道是什么意思?要我提供一个可以运行的 sn-p 吗?
  • @MariuszS 我正在努力

标签: java boolean logic boolean-logic boolean-operations


【解决方案1】:

您应该检查每个 if 语句中的单个 chkExcludedAX(以及您的逻辑的其他问题)。

尝试类似:

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()));

【讨论】:

  • 好吧,实际上你的回答似乎真的很好(你给我带来了很大的痛苦)。在我接受答案之前,我会对其进行一些进一步的测试:) 但是谢谢!!
【解决方案2】:

我假设您有一个按钮或其他东西让用户确认其选择。然后,此选择应触发 ActionListeners actionPerformed 方法,您必须确保在该方法中可以访问不同的 UI 元素。

在执行方法的动作中,如果不是绝对必要的话,我不会担心具体的选择,而是我会做两件事(假设一个非常简单的情况):

对于任何选中的复选框(方向 1-4)....

1.) ...获取相应的起始值,确定最小值 2.) ...得到相应的最终值,确定最高值 3.) 排除最低和最高值之间的所有值

这样您就不必关心可能重叠的不同值。但是,如果您希望能够排除段并且仍然不必担心重叠,则必须执行以下操作:

对于任何选中的复选框(方向 1-4)....

1.) ... 获取相应的开始/结束值 2.) ...调用一个方法将要排除的数字添加到提供开始/结束值的数组中 3.) ...让该方法查看当前的数字数组以检查是否已经包含开始/结束值或它们之间的值,如果没有,则使用此方法添加值 4.) ...使用该方法中准备好的数组

如果您想排除范围 100-200 和 400-500 但仍包含 201-399,则更有可能出现这种情况。

请随时提供您的代码,以便我们更好地理解您需要排除的形式(例如数组中的数字、最小值/最大值或自己的数据类型 Range 等)。

【讨论】:

  • 是的,我有按钮,而且我确实通过动作侦听器获得了值。一旦我有了这些值,我就会将它们存储到一个对象中。可悲的是,我需要关心不同的细分市场,因此我猜你的第二个答案可能更合适。因此,如果我对您的答案进行简要总结,您会建议我将微调器值存储到一个自填充数组中,该数组用最小/最大值之间的所有值填充数组。这样我就可以将我的值与数组进行比较,并只打印不在数组中的值?
【解决方案3】:

在你的代码中不可能达到这个要求a4 == true &amp;&amp; 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 &amp;&amp; b &amp;&amp; c &amp;&amp; d == true 那么(a1 = true) &amp;&amp; (a2 &amp;&amp; a3 &amp;&amp; a4 == false)

【讨论】:

  • 你确定吗?因为如果我选择了多个区域,那么我必须在这两个区域中检查我的观点,如果我的观点不在这两个领域中,那么 a1 和 a2 将是正确的,还是我完全错了? ://
  • 你的意思是这样的: if (a) { a1 = true; } if (b) { a2 = true; } if (c) { a3 = true; } if (d) { a4 = true; } ???
  • 我的意思是错误在这里,我不知道应该是什么;)我认为@Dukeling 为您提供了很好的答案。
猜你喜欢
  • 2012-08-04
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
相关资源
最近更新 更多