我正在尝试实现一些非常简单的东西(在原理上),但我在实现方面遇到了一些麻烦。
在我的程序中,用户必须在 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;
}
答案 0 :(得分: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()));
答案 1 :(得分:0)
我假设您有一个Button或其他东西让用户确认其选择。然后,此选择应触发ActionListeners actionPerformed方法,您必须确保在该方法中可以访问不同的UI元素。
在动作Performed方法中,如果不是绝对必要的话,我不打扰特定的选择,而是我只做两件事(这假设一个非常简单的情况):
对于任何选中的复选框(方向1-4)....
1。)...获取相应的起始值,确定最低值 2.)...获得相应的最终值,确定最高值 3.)排除最低值和最高值之间的所有值
这样您就不必关心可能重叠的不同值。但是,如果您希望能够排除细分并且仍然不必担心重叠,则必须执行以下操作:
对于任何选中的复选框(方向1-4)....
1。)...获取相应的开始/结束值 2.)...调用一种方法,将要排除的数字添加到提供开始/结束值的数组中 3.)...让方法查看当前数字数组,以检查是否已包含开始/结束值或它们之间的值,如果没有这个方法添加值 4.)...使用该方法中准备好的数组
如果您想要排除范围100-200和400-500但仍包含201-399,则更有可能出现这种情况。
随意提供您的代码,以便我们更好地理解您需要排除的形式(例如,数组中的数字,最小/最大值或自己的数据类型范围等)。
答案 2 :(得分:0)
在您的代码中无法实现此要求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)