给定Java中的几个数组(我将循环通过当前存储在HashMap中的键),我希望能够识别(基于当前存储的boolean[]
个键)哪个索引是{{ 1}}在所有这些中,true
。
示例:
false
将索引0作为具有所有真值,并将索引2作为具有所有假值。
我的一个想法是将布尔数组转换为整数数组,对值求和,如果求和数组索引= numArrays,则所有这些都是True。类似地,如果求和的数组索引为0,则它们全部为假。
我不确定如何以有效的方式(在java中)这样做,如果这是一个很好的方法来实现我想要的结果。
有没有办法将布尔数组转换为整数?如果没有,是最简单的替代实例化一个新的int数组,并循环通过布尔数组来填充新数组?
答案 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
如果它是false
而false
如果它是{{1 }})。
使用它,我们可以表达此检查:如果数组 foo 中位置true
的元素是i
, AND ALSO < / strong>数组 bar 中位置false
处的元素是i
, AND ALSO 位置元素数组 baz 中的false
是i
...我们会做点什么。
所以我们需要第五个数组:
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
结果