创建大小为n的布尔数组的所有可能方式?

时间:2014-11-19 02:10:27

标签: java arrays boolean combinations

我需要能够创建一个组合的布尔数组,并通过程序运行它以查看它是否有效。如果没有,那么我将其丢弃并转到下一个组合。我的问题是我不知道如何创建这个数组,因为n可以等于1-1000。所以我打算使用Integer.toBinaryString,但由于它太过大而不能超过32,所以它不会起作用。 任何帮助都会很棒。

谢谢!

3 个答案:

答案 0 :(得分:3)

我已经在另一个SO question上找到了您问题的答案,我已经为您调整了这个问题:

public class Foo {
    public static void main(String[] args) {
        final int n = 3;
        for (int i = 0; i < Math.pow(2, n); i++) {
            String bin = Integer.toBinaryString(i);
            while (bin.length() < n)
                bin = "0" + bin;
            char[] chars = bin.toCharArray();
            boolean[] boolArray = new boolean[n];
            for (int j = 0; j < chars.length; j++) {
                boolArray[j] = chars[j] == '0' ? true : false;
            }
            System.out.println(Arrays.toString(boolArray));
        }
    }
}

将产生:

[true, true, true]
[true, true, false]
[true, false, true]
[true, false, false]
[false, true, true]
[false, true, false]
[false, false, true]
[false, false, false]

经过测试,这适用于n的高值,例如10000等等。

答案 1 :(得分:3)

接受的答案”表明

  

经过测试,这将适用于n的高值,例如10000等等。

不正确

public static void main(String[] args) {
    final int n = 3;
    for (int i = 0; i < Math.pow(2, n); i++) {
        String bin = Integer.toBinaryString(i);
        while (bin.length() < n)
            bin = "0" + bin;
        char[] chars = bin.toCharArray();
        boolean[] boolArray = new boolean[n];
        for (int j = 0; j < chars.length; j++) {
            boolArray[j] = chars[j] == '0' ? true : false;
        }
        System.out.println(Arrays.toString(boolArray));
    }
}

n > 31永远循环重复前2 ^ 31个组合,因为i 溢出并且永远不会到达Math.pow(2, n)。您可以使用

轻松测试
public static void main2(String[] args){
        int n = 32;
        for (int i = 0; i < Math.pow(2, n); i++){
            if (i == Integer.MIN_VALUE) {
                // i overflows
                System.out.println("i exceeded Integer.MAX_VALUE");
            }
        }
    }

以上代码将无限期打印i exceeded Integer.MAX_VALUE 但是,使用BigInteger或类似的数据结构进行循环可以很容易地纠正这种情况。以下代码适用于n <= Integer.MAX_VALUE

public static void main(String[] args) {
    final int n = 32;
    BigInteger bi = BigInteger.ZERO;
    BigDecimal rows = new BigDecimal(Math.pow(2, n));
    while (bi.compareTo(rows.toBigInteger()) < 0) {
        String bin = bi.toString(2);//Integer.toBinaryString(i);
        while (bin.length() < n)
            bin = "0" + bin;
        char[] chars = bin.toCharArray();
        boolean[] boolArray = new boolean[n];
        for (int j = 0; j < chars.length; j++) {
            boolArray[j] = chars[j] == '0' ? true : false;
        }
        System.out.println(Arrays.toString(boolArray));
        bi = bi.add(BigInteger.ONE);
    }
}

答案 2 :(得分:0)

我知道这里有一个Java标签。我只想将我从Java转换的快速代码添加到答案中。

    let SIZE = 4
    let max = (pow(2, SIZE) as NSDecimalNumber).intValue;
    for i in 0..<max {
        var bin = String(i, radix: 2)
        while (bin.count < SIZE){
            bin = "0" + bin
        }
        var boolArray = [Bool]();
        var count = 0
        for ch in bin {
            boolArray.append(ch == "0")
            count = count + 1
        }
        print(boolArray)
    }