测量数组之间的重叠

时间:2015-09-30 06:31:47

标签: java arrays

给定Java中的几个数组(我将循环通过当前存储在HashMap中的键),我希望能够识别(基于当前存储的boolean[]个键)哪个索引是{{ 1}}在所有这些中,true

示例:

false

将索引0作为具有所有真值,并将索引2作为具有所有假值。

我的一个想法是将布尔数组转换为整数数组,对值求和,如果求和数组索引= numArrays,则所有这些都是True。类似地,如果求和的数组索引为0,则它​​们全部为假。

我不确定如何以有效的方式(在java中)这样做,如果这是一个很好的方法来实现我想要的结果。

有没有办法将布尔数组转换为整数?如果没有,是最简单的替代实例化一个新的int数组,并循环通过布尔数组来填充新数组?

3 个答案:

答案 0 :(得分:2)

他们是布尔人,所以我真的不知道你为什么要把它们转换成整数并将它们总结起来:它会很容易但绝对没用。

因此。我假设你没有把它们放在一个矩阵中(我实际上假设你不知道矩阵是什么,但请不要被这个冒犯),你把它们放在不同的数组中然后你确切地知道你有多少阵列(让我们说3)。我也假设他们都有相同的长度。

这个想法是:对于每个可用位置,我们检查占据三个阵列中该位置的三个元素,看它们是否都是真的。我们可以用这种比较的结果做什么?我们可以将它打印到屏幕上,把它放在另一个数组中,或者我们想要做的任何事情。

让我们从三个阵列开始:

boolean[] foo = {true, true, false};
boolean[] bar = {true, false, false};
boolean[] baz = {true, false, false};

确定。我们现在可以创建第四个数组来存储我们的结果。

boolean[] qux = new boolean[3];

或者,甚至更好:

boolean[] qux = new boolean[foo.length];

让我们开始构建我们的C风格循环:

for (i = 0; i < foo.length; i++) {
    ...
}

如果您正在使用数组,您可能已经知道 for 循环是如何工作的:第一个语句将被执行,就好像它是之前整个代码块一样在大括号内;每次执行块时,第二个语句都会被检查为第一个指令,如果它失败,则循环停止;每次执行块时,第三个语句将作为 last 指令执行 您可能已经知道,如果数组的长度为n,则其元素的索引将为0, [...], n-1
如果您不了解这两件事......嗯,欢迎您。

那么,我说我们想要对每个可用职位做些什么?我们想比较那个位置的三个要素。所以for循环变为:

for (int i = 0; i < foo.length; i++) {

    if (foo[i] && bar[i] && baz[i]) {
        ...
    }

}

我们刚刚添加的是此检查:如果数组 foo 中位置i处的元素是true 和ALSO 数组中位置i处的元素是true 并且 元素数组 baz 中的i位置是true ...我们会做点什么。

我们可以将结果放在 qux

for (int i = 0; i < foo.length; i++) {

    if (foo[i] && bar[i] && baz[i]) {

        qux[i] = true;

    } else {

        qux[i] = false;

    }

}

请注意,比较本身的计算结果为布尔值,当值为true时,我们存储true;当false我们存储false时。所以我们也可以写:

for (int i = 0; i < foo.length; i++) {

    qux[i] = (foo[i] && bar[i] && baz[i]);

}

Grrrrreat,我们实现了我们想要实现的目标!你还想显示这样的结果吗?让我向您介绍增强的循环:

for (boolean val : qux) {
    ...
}

基本上,作为一个布尔数组的 qux ,它是一个&#34;容器&#34;布尔值这句话说:对于构成 qux 的每个元素......做点什么。

所以,让我们用它来打印这些元素:

for (boolean val : qux) {

    System.out.println(val);

}

对象println()中的方法out,类System的静态成员(如果您不理解所有这些条款,请不要担心,您将了解他们的意思是如果你继续学习Java)在屏幕上显示的东西。从技术上讲,这是&#34;东西&#34;应该是一个字符串,但由于Java知道如何用布尔值来创建字符串,所以在将 val 传递给它时我们不必太担心。

想要在第一个中为做所有事情,并以漂亮的方式打印?馅饼很简单:

for (int i = 0; i < foo.length; i++) {

    qux[i] = (foo[i] && bar[i] && baz[i]);

    System.out.println("At position " + i + " we have " + qux[i]);

}

那么,我们现在如何检查所有错误的位置?我们可以使用bang(!),其含义是:取这个布尔值并考虑它的否定(true如果它是falsefalse如果它是{{1 }})。
使用它,我们可以表达此检查:如果数组 foo 中位置true的元素是i AND ALSO < / strong>数组 bar 中位置false处的元素是i AND ALSO 位置元素数组 baz 中的falsei ...我们会做点什么。

所以我们需要第五个数组:

false

我们会将循环更改为

boolean[] norf = new boolean[foo.length];

希望这很有用。

答案 1 :(得分:1)

假设所有数组都具有相同数量的元素,您可以尝试这样做:

public static void main(String[] args) {
    boolean[] array1 = new boolean[] {true,true,false};
    boolean[] array2 = new boolean[] {true,false,false};
    boolean[] array3 = new boolean[] {true,false,false};
    boolean[] array4 = new boolean[] {true,false,false};

    compareAndPrintCommonIndicesForArrays(array1, array2, array3);
}

public static boolean compareAndPrintCommonIndicesForArrays(boolean[] ...arrays) {
    boolean result =true;
    boolean itemToCompare;
    int elementsToCompare = arrays[0].length;

    for(int itemIndex=0; itemIndex<elementsToCompare; itemIndex++) {
        result = true;
        itemToCompare = arrays[0][itemIndex];
        for(int arrayIndex = 0; arrayIndex<arrays.length;arrayIndex++) {
            if(itemToCompare != arrays[arrayIndex][itemIndex]) {
                result = false;
            }
        }
        if(result) System.out.println(itemIndex);
    }
    return result;
}

打印:

0 2

代码将遍历所有索引,并且对于每个索引,它将比较该索引处所有数组中的元素。如果它们都相同则打印索引。

答案 2 :(得分:0)

基本上,您希望将数组包装在另一个数组中,创建一个2D矩阵,例如......

boolean matrix[][] = {
    {true, true, false},
    {true, false, false},
    {true, false, false}
};

然后,对于每一列,在每一行中,您要检查值是否匹配

boolean results[] = new boolean[3];
for (int col = 0; col < 3; col++) {
    Boolean value = null;
    boolean matches = true;
    for (int row = 0; row < matrix.length; row++) {
        if (value == null) {
            value = matrix[row][col];
        } else if (matrix[row][col] != value) {
            matches = false;
            break;
        }
    }
    results[col] = matches;
}
System.out.println(Arrays.toString(results));
for (int col = 0; col < results.length; col++) {
    if (results[col]) {
        System.out.println(col);
    }
}

哪个打印......

[true, false, true]
0
2

boolean results[]数组的原因是因为每列匹配(true)或不匹配(false),只需检查每个元素即可确定哪个索引导致true结果