Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
if条件检查在JAVA中的任何一点上是否只有一个变量由四个变量组成_Java_Logic_Logical Operators - Fatal编程技术网

if条件检查在JAVA中的任何一点上是否只有一个变量由四个变量组成

if条件检查在JAVA中的任何一点上是否只有一个变量由四个变量组成,java,logic,logical-operators,Java,Logic,Logical Operators,如果设置了四个变量中的一个以上,我想显示一个错误。。。 在Java中..这就是我想到的 if( (isAset() && isBset()) || (isBset() && isCset()) || (isCset() && isDset()) || (isDset() && isAset()) ) attri.greedySelectionException(..); 我想看看是否有更好的方法来做这件事。你用一个计数

如果设置了四个变量中的一个以上,我想显示一个错误。。。 在Java中..这就是我想到的

if( (isAset() && isBset()) || (isBset() && isCset()) || (isCset() && isDset()) || (isDset() && isAset()) )
    attri.greedySelectionException(..);  

我想看看是否有更好的方法来做这件事。

你用一个计数器,然后把它和1比较一下怎么样

类似于

int i = 0;
if (isAset()) i++;
if (isBset()) i++;
if (isCset()) i++;
if (isDset()) i++;

if (i > 1)
  ...
或者,如果要检查某个对象的属性,可以使用一些反射来迭代相关属性,而不是每个属性都有一个if语句

编辑:查看下面MariusŽilėnas的varargs static方法,以获得更整洁的代码,即使用(将旧学派的for each改为a,将三元表达式改为if):


而不是几个if语句。

使用计数器,然后将其与1进行比较怎么样

类似于

int i = 0;
if (isAset()) i++;
if (isBset()) i++;
if (isCset()) i++;
if (isDset()) i++;

if (i > 1)
  ...
或者,如果要检查某个对象的属性,可以使用一些反射来迭代相关属性,而不是每个属性都有一个if语句

编辑:查看下面MariusŽilėnas的varargs static方法,以获得更整洁的代码,即使用(将旧学派的for each改为a,将三元表达式改为if):


而不是几个if语句。

您可以使用以下方法简化此表达式:

if((isAset() || isCset()) && (isBset() || isDset()))
   attri.greedySelectionException(..);  
Wolfram alpha为您完成了这项工作:

您可以使用真值表进行验证:


您可以使用以下方法简化此表达式:

if((isAset() || isCset()) && (isBset() || isDset()))
   attri.greedySelectionException(..);  
Wolfram alpha为您完成了这项工作:

您可以使用真值表进行验证:

我建议使用(参见Java教程)并生成一个函数,计算给定的True数。下面的代码对此进行了演示:

public class Values
{
    public static boolean isASet()
    {
        return false;
    }

    public static boolean isBSet()
    {
        return true;
    }

    public static boolean isCSet()
    {
        return true;
    }

    public static boolean isDSet()
    {
        return true;
    }

    public static int booleans(boolean... booleans)
    {
        int sum = 0;
        for (int i = 0; i < booleans.length; i++)
        {
            sum += booleans[i] ? 1 : 0;
        }
        return sum;
    }

    public static void main(String[] args)
    {
        System.out.println(
                booleans(isASet(), isBSet(), isCSet(), isDSet()));
        if (1 < booleans(isASet(), isBSet(), isCSet(), isDSet()))
        {
            System.out.println("Condition met.");
        }
    }
}
公共类值
{
公共静态布尔isASet()
{
返回false;
}
公共静态布尔值isBSet()
{
返回true;
}
公共静态布尔值isCSet()
{
返回true;
}
公共静态布尔isDSet()
{
返回true;
}
公共静态整数布尔值(布尔值…布尔值)
{
整数和=0;
for(int i=0;i
我建议使用(参见Java教程)并生成一个函数来计算给定的trues数。下面的代码对此进行了演示:

public class Values
{
    public static boolean isASet()
    {
        return false;
    }

    public static boolean isBSet()
    {
        return true;
    }

    public static boolean isCSet()
    {
        return true;
    }

    public static boolean isDSet()
    {
        return true;
    }

    public static int booleans(boolean... booleans)
    {
        int sum = 0;
        for (int i = 0; i < booleans.length; i++)
        {
            sum += booleans[i] ? 1 : 0;
        }
        return sum;
    }

    public static void main(String[] args)
    {
        System.out.println(
                booleans(isASet(), isBSet(), isCSet(), isDSet()));
        if (1 < booleans(isASet(), isBSet(), isCSet(), isDSet()))
        {
            System.out.println("Condition met.");
        }
    }
}
公共类值
{
公共静态布尔isASet()
{
返回false;
}
公共静态布尔值isBSet()
{
返回true;
}
公共静态布尔值isCSet()
{
返回true;
}
公共静态布尔isDSet()
{
返回true;
}
公共静态整数布尔值(布尔值…布尔值)
{
整数和=0;
for(int i=0;i
试试这个:

if (!(isAset ^ isBset ^ isCset ^ isDset))
只有当任何一个为真或为假时,此选项才为真。

尝试以下操作:

if (!(isAset ^ isBset ^ isCset ^ isDset))

这将仅在任何一个为真或为假时为真。

如果您可以控制isAset()、isBSet、isCSet和isDset方法的实现,那么如果您从此函数返回1或0而不是true或FALE,则可以更清楚地实现这一点。这些函数将按如下方式创建

public int isAset()
{
   return (A != null) ? 1 : 0;
}
若要验证是否设置了多个变量,请使用以下内容

if( isASet() + isBSet() + isCSet() + isDSet() > 1)
     ThrowMoreAreSetException()
如果你无法控制,这里有另一种方法

int count = isASet() ? 1 : 0;
count+= isBSet() ? 1 : 0;
count+= isCSet() ? 1 : 0;
count+= isDSet() ? 1 : 0;

if(count > 1)
 ThrowMoreAreSetException()

通过遵循这两种方法中的任何一种,代码将比任何比较组合都不那么笨拙,可读性也更高

如果您可以控制isAset()、isBSet、isCSet和isDset方法的实现,那么如果您在此函数中返回1或0而不是true或false,则可以更清楚地实现这一点。这些函数将按如下方式创建

public int isAset()
{
   return (A != null) ? 1 : 0;
}
若要验证是否设置了多个变量,请使用以下内容

if( isASet() + isBSet() + isCSet() + isDSet() > 1)
     ThrowMoreAreSetException()
如果你无法控制,这里有另一种方法

int count = isASet() ? 1 : 0;
count+= isBSet() ? 1 : 0;
count+= isCSet() ? 1 : 0;
count+= isDSet() ? 1 : 0;

if(count > 1)
 ThrowMoreAreSetException()

通过遵循这两种方法中的任何一种,代码将比任何比较组合都不那么笨拙,可读性也更高

在Java 8中,您可以优雅地使用流解决此问题(如果未设置值,则假设值为null):


在Java 8中,您可以优雅地使用流解决此问题(如果未设置值,则假设值为null):


如果我没有错的话,OP在表达式中包含一个错误,即它不考虑<代码> < <代码> >代码> c>代码>。不管怎样,感谢链接到WalfRAM Alpha。如果我没有错的话,OP在表达式中包含一个错误,即它不考虑<代码> < <代码> >代码> c>代码>。无论如何,谢谢你给Wolfram Alpha的链接。首先,如果只有一个是真的,那就是假的(开头有一个否定)。此外,如果其中三个是真的,那么XOR也是真的。我认为表达式不准确。所有四个布尔值不会同时操作,表达式将从左到右求值,因此
true^true^true^false
true^false^false
将求值为相同的值。很明显,这个表达式并没有给出预期的结果,我的意思就是。顺便说一下,n元异或的求值顺序不会影响结果,因为异或是一个关联运算符