如果同一位置的所有数组元素都为真,如何获得真

Posted

技术标签:

【中文标题】如果同一位置的所有数组元素都为真,如何获得真【英文标题】:How to get true if all the array elements in the same position are true 【发布时间】:2016-05-13 17:58:24 【问题描述】:

我正在使用 n 个布尔数组,如下所示:

A  = [1, 1, 0, 1]
A1 = [0, 1, 0, 1]
A2 = [0, 1, 0, 0]

B  = [1, 1, 0, 1]
B1 = [0, 0, 0, 1]
B2 = [0, 1, 0, 0]

我正在开发一个函数,如果存在至少一个 1(例如,在三个 A 数组中,我会得到 true,因为 A[1] = A1[1] = A2[1] = true)返回 true 在 B 数组中,我会得到 false。

我知道我可以创建一个结果布尔数组并通过循环获得输出,但我想问是否有更优雅的方法来获得此结果而无需使用太多循环。

【问题讨论】:

所有数组的长度都一样吗?列可以是任意的吗? 也许您可以将数组转换为二进制表示,然后执行 AND 操作并检查结果是否为 0!但我不认为这比你的方法更好! @Grundy 列的长度必须相同,并且只能是布尔值 【参考方案1】:

虽然这种转换过程远非最快,但我更愿意将这种情况视为一组二进制位,而不是一系列布尔值 - 此时二进制 AND 将为您提供答案:

int ToInt(IEnumerable<bool> bits) => bits.Select((b, i) => ((b ? 1 : 0) << i))
                                         .Aggregate((b, b1) => (b | b1));    

bool HasCommonBits(params <IEnumerable<bool>[] seqs) => 
     seqs.Aggregate((s, i) => s.ToInt() & i) > 0;
...

if(HasCommonBits(A, A1, A2))
...

【讨论】:

【参考方案2】:

与the accepted answer 有点不同,因为它使用boolean[][]

您的示例数组:

bool[][] boolArrays1 =  
                           new[]true, true, false, true, 
                           new[]false, true, false, true, 
                           new[]false, true, false, false, 
                       ;
bool[][] boolArrays2 =  
                           new[]true, true, false, true, 
                           new[]false, false, false, true, 
                           new[]false, true, false, false, 
                       ;

现在您可以使用AnyAll 的组合:

bool anyColumnTrue1 = Enumerable.Range(0, boolArrays1.Min(arr => arr.Length))
    .Any(ix => boolArrays1.All(arr => arr[ix]));  // true
bool anyColumnTrue2 = Enumerable.Range(0, boolArrays2.Min(arr => arr.Length))
    .Any(ix => boolArrays2.All(arr => arr[ix]));  // false

既然你已经要求一个方法,你可以使用这个扩展方法,它支持可以以任何序列存储的数组和列表:

public static bool AnyColumnTrue(this IEnumerable<IList<bool>> bools) 

    if (bools == null) throw new ArgumentNullException("bools");

    return Enumerable.Range(0, bools.Min(seq => seq.Count))
        .Any(ix => bools.All(arr => arr[ix]));

那么简单易读:

bool anyColumnTrue = boolArrays1.AnyColumnTrue();

如果您实际上有数组变量而不是集合,您仍然可以轻松使用我的方法:

bool anyColumnTrue = new[] A, A1, A2 .AnyColumnTrue();

【讨论】:

【参考方案3】:

试试这个代码,方法不依赖于数组的数量:

class Program

    public static bool[] Convert(params bool[][] args)
                
        return (new List<bool[]>(args)).Aggregate((a, b) => a.Select((x, i) => x && b[i]).ToArray());
    

    static void Main(string[] args)
    
        var A = new[]  true, true, false, true ;
        var A1 = new[]  false, true, false, true ;
        var A2 = new[]  false, true, false, false ;
        var A3 = new[]  true, true, true, true ;

        var res = Convert(A, A1, A2, A3);
    

【讨论】:

【参考方案4】:

使用 Linq 的另一种选择:

var anyColumnAllTrue = A.Select((value, index) => 
    value && A1[index] && A2[index])
.Any(result => result);

【讨论】:

【参考方案5】:

我为此建议一个提取方法(你可以在其中放置任意数量的任意长度的数组):

    private static Boolean HasOnes(params Boolean[][] items) 
      for (int i = items.Min(line => line.Length) - 1; i >= 0; --i)
        if (items.All(line => line[i]))
          return true;

      return false;
    

....

    Boolean[] A =   true, true, false, true ;
    Boolean[] A1 =  false, true, true, true ;
    Boolean[] A2 =  false, true, false, false ;

    Console.Write(HasOnes(A, A1, A2) ? "Yes" : "No");

    Boolean[] B  = true, true, false, true;
    Boolean[] B1 = false false, false, true;
    Boolean[] B2 = false, true, false, false;

    Console.Write(HasOnes(B, B1, B2) ? "Yes" : "No");

【讨论】:

【参考方案6】:

以下允许您指定任意数量的数组

class Program
    
        static void Main(string[] args)
        
            var A = new bool[]  true, true, false, true ;
            var A1 = new bool[]  false, true, false, true ;
            var A2 = new bool[]  false, true, false, false ;

            var B = new bool[]  true, true, false, true ;
            var B1 = new bool[]  false, false, false, true ;
            var B2 = new bool[]  false, true, false, false ;

            Console.WriteLine(AtLeastOneColumnIsTrue(A, A1, A2));
            Console.WriteLine(AtLeastOneColumnIsTrue(B, B1, B2));

            Console.ReadLine();
        

        public static bool AtLeastOneColumnIsTrue(params bool[][] boolArrays)
        
            for (int column = 0; column < boolArrays[0].Length; column++)
            
                var columnIsAllTrue = true;

                for (int boolArray = 0; boolArray < boolArrays.Length && columnIsAllTrue; boolArray++)
                
                    columnIsAllTrue = columnIsAllTrue && boolArrays[boolArray][column];
                

                if (columnIsAllTrue)
                
                    return true;
                
            

            return false;
        
    

【讨论】:

【参考方案7】:

这样的事情可以解决问题:

bool[] A = ...;
bool[] A1 = ...;
bool[] A2 = ...;

var length = Math.Min(Math.Min(A.Length, A1.Length), A2.Length);
var result = Enumerable.Range(0, length).Any(i => A[i] && A1[i] && A2[i]);

如果你事先知道长度是多少,你可以跳过长度计算,这会减少一条线。

【讨论】:

以上是关于如果同一位置的所有数组元素都为真,如何获得真的主要内容,如果未能解决你的问题,请参考以下文章

如何将 DOM 更改为“if/else”语句单独为真,如果所有 if 语句都为真,也将变量设置为真?

all ,any,abs的使用

老男孩学习 python 5 内置函数和文件操作

如何从一个数组中查找指定的元素,并返回这个元素在数组中的位置

Python基础内置函数及用法解析

检查数组中的所有值是不是为真,然后返回一个真布尔语句(javascript)[重复]