是否有帮助程序类在任何标准库中对布尔集合实现逻辑运算?

时间:2012-01-09 09:44:53

标签: java collections boolean guava

我编造了这个小助手班,并想知道是否有任何地方我可以从中窃取它而不是重新实现轮子:

public class Booleans3 {
    private Booleans3(){}

    public static boolean and(Iterable<Boolean> booleans) {
        boolean result = true;
        for (Boolean boolRef : booleans) {
            boolean bool = boolRef;
            result &= bool;
        }
        return result;
    }

    public static boolean or(Iterable<Boolean> booleans) {
        boolean result = false;
        for (Boolean boolRef : booleans) {
            boolean bool = boolRef;
            result |= bool;
        }
        return result;
    }
}

我查看了com.google.common.primitives.Booleans,但它似乎并不包含我需要的内容。

4 个答案:

答案 0 :(得分:12)

这个怎么样:

public static boolean and(Collection<Boolean> booleans)
{
    return !booleans.contains(Boolean.FALSE);
}

public static boolean or(Collection<Boolean> booleans)
{
    return booleans.contains(Boolean.TRUE);
}

答案 1 :(得分:2)

虽然@ eng-fouad的答案已经足够好了,但我仍然建议另一个使用Iterables.all()Iterables.any()equalTo谓词的答案:

import java.util.Arrays;

import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;

import static com.google.common.collect.Iterables.all;
import static com.google.common.collect.Iterables.any;
import static com.google.common.base.Predicates.equalTo;

...

Iterable<Boolean> booleans = Arrays.asList(TRUE, TRUE, FALSE);

System.out.println(all(booleans, equalTo(TRUE)));
System.out.println(any(booleans, equalTo(TRUE)));

将打印

false
true

正如我所看到的那样:

  • 使用Guava库
  • 无需使用方法编写自己的类
  • 更好的可读性(恕我直言)

答案 2 :(得分:1)

我不相信Java标准库中有任何部分可以提供这种功能。

在某些语言中,这些是以anyOf(适用于or)或allOf(适用于and)的功能提供的。您可能有幸找到实现这些功能的Java库。

注意 - 你在这里的代码可以进行相当多的优化。请注意,如果您计算许多布尔值的AND,则只要找到false值,就可以停止并说明答案为false。同样,如果您计算布尔值的OR,则可以在找到true值后立即停止,因为答案为true。这实质上是short-circuit evaluation对对象列表的概括,并且是在诸如Scheme之类的语言中某些版本的andor的行为。这给出了以下内容:

public class ModifiedBooleans3 {
    private ModifiedBooleans3(){}

    public static boolean and(Iterable<Boolean> booleans) {
        for (Boolean boolRef : booleans)
            if (!boolRef)
                return false;
        return true;
    }

    public static boolean or(Iterable<Boolean> booleans) {
        for (Boolean boolRef : booleans)
            if (boolRef)
                return true;
        return false;
    }
}

希望这有帮助!

答案 3 :(得分:0)

@Eng.Fouad答案的改进:

如果false集合是booleannull,则以下代码返回empty,否则对元素进行逻辑运算:

public static boolean and(Collection<Boolean> booleans) {
    return booleans != null && !booleans.isEmpty() && !booleans.contains(Boolean.FALSE);
}

public static boolean or(Collection<Boolean> booleans) {
    return booleans != null && !booleans.isEmpty() && booleans.contains(Boolean.TRUE);
}