我有一个如下所示的数组:
Bar
我想在这个数组的所有元素之间进行AND / OR比较,例如:
AND示例:true AND false AND true AND true
所以我可以得到上面例子中的最终结果,或者:
OR示例:true或false OR true或true
在上面的例子中,这会让我真实。
数组中有任何内置方法可以让我这样做吗?或者我是否应该在所有元素之间进行迭代并逐一进行比较?
答案 0 :(得分:18)
根据评论和其他答案,您可以使用LINQ来实现这两个目标。 (尽管你不必这样做; farbiondriven的答案绝对可以正常使用,尽管LINQ解决方案可以处理任何 IEnumerable<bool>
并不是一般目的。)
Any
将检测任何元素是否为true
,这与对所有元素执行逻辑OR
的结果相同。< / p>
带有标识投影的
All
将检测所有元素是否为true
,这与在所有元素上执行逻辑AND
的结果相同:< / p>
bool orResult = array.Any(x => x);
bool andResult = array.All(x => x);
这两个都会短路:如果第一个元素是true
,那么Any
将不会看到后面的元素,因为结果肯定是true
。同样,如果第一个元素是false
,那么All
将不会费心查看以后的元素,因为结果肯定是false.
但是,您可能需要考虑您希望结果为空数组的内容。 Any()
将在空序列上返回false
,而All
将在空序列上返回true。这可能是也可能不是你期望或需要的。
答案 1 :(得分:7)
这可以通过linq完成:
package mwe
import org.apache.spark.sql.api.java.UDF1
class SomeFun extends UDF1[Int, Int] {
private var prop: Int = 0
override def call(input: Int): Int = {
if (prop == 0) {
prop = input
}
prop + input
}
}
答案 2 :(得分:2)
使用Linq Aggregate
和二进制&
和|
操作的方法
bool[] array = new bool[4] { true, false, true, true } ;
bool resultAnd = array.Aggregate((a, b) => a & b); // AND
bool resultOr = array.Aggregate((a, b) => a | b); //OR
bool resultXor = array.Aggregate((a, b) => a ^ b); //XOR
答案 3 :(得分:1)
如果可能不需要LinQ解决方案:
public static bool Or(IList<bool> bList)
{
return bList.Contains(true);
}
public static bool And(IList<bool> bList)
{
return !bList.Contains(false);
}
答案 4 :(得分:1)
数组中有任何内置方法允许我这样做吗?
答案:是的。 System.Array Class中有静态方法可以使用。
例如,Array.IndexOf Method (T[], T):
bool andResult = !(Array.IndexOf<bool>(array, false) > -1);
bool orResult = Array.IndexOf<bool>(array, true) > -1;
但是,您需要定义如何处理空数组的边缘情况。
Array Class中还有其他方法也可用于构造逻辑。我会为你做这个练习。