提问人:Jack M 提问时间:9/22/2023 更新时间:9/22/2023 访问量:83
创建一个函数,该函数返回数组中 true 值的数量
Create a function which returns the number of true values there are in an array
问:
代码编译,但始终返回 0。当我读出代码时,它应该工作是有道理的;我花了一段时间进行故障排除,不知道为什么它不起作用。
public class Challenge {
public static int countTrue(boolean[] arr) {
// declaring the variable to return
int amountTrue = 0;
// for each to loop through the array
for (boolean i : arr) {
// if array item == true add 1 to variable amountTrue, if false, add 0 to amountTrue
if (arr.equals(true)) {
return amountTrue++;
} else {
return amountTrue + 0;
}}
// returning the variable
return amountTrue; }}
我希望该函数计算数组中的所有真值。我已经尝试了 for 循环和 for 每个循环。
答:
1赞
aTancredi
9/22/2023
#1
试试这个。你不应该在循环中返回,你也在测试数组的 true 而不是元素 i,它总是返回 false,因此你总是得到零
public class Challenge {
public static int countTrue(boolean[] arr) {
// declaring the variable to return
int amountTrue = 0;
// for each to loop through the array
for (boolean i : arr) {
// if array item == true add 1 to variable amountTrue
// if false do nothing
if (i.equals(true)) {
amountTrue += 1;
}
}
// returning the variable
return amountTrue;
}
}
评论
0赞
Robby Cornelissen
9/22/2023
不要将原语与 进行比较。它会导致不必要的自动装箱。equals()
1赞
user85421
9/22/2023
if (i.equals(true)
正在做很多不必要的事情:(1)自动装箱从到;(2)将操作数(由编译器完成)转换为;(3)调用方法...为了比较我们应该使用的原语;(4)比较或(不需要比较任何布尔表达式(例如)与{相同,只是i
boolean
Boolean
true
Boolean.TRUE
equals
==
true
Boolean.TRUE
i
true
x == true
x
} )
1赞
user85421
9/22/2023
实际上,它会编译吗?我们可以从原语调用方法吗?忘记之前的评论,不会有自动装箱,但会有一个编译错误(并点赞了两次......
0赞
Robby Cornelissen
9/22/2023
@user85421 你是对的。不编译。
-1赞
Luca Micarelli
9/22/2023
#2
在循环中只写这个:
if (i == true) {
amountTree++;
}
没有 else,最后只需返回 amountTree,在您的代码中,您检查对象 arr 是否等于布尔值 true,但 arr 是一个数组,您必须检查布尔值的 i 元素,您不必在循环中使用返回值,因为这会停止您的代码,最后没有任何意义(如果 i != true,则添加 0), 如果 (i element == true),则只能添加 1
评论
1赞
user85421
9/22/2023
这里没有必要将任何布尔表达式(例如)与 { 进行比较,就像任何表达式一样i
true
x == true
x
x
}
0赞
Luca Micarelli
9/22/2023
如果输入是布尔值列表,则必须检查每个项目 == true 是否将 1 添加到 amountTree
1赞
user85421
9/22/2023
if (i == true)
最好写成!!if (i)
0赞
Luca Micarelli
9/22/2023
是的,当然,但我认为为了理解初始错误,最好编写大量代码
0赞
user85421
9/22/2023
按照这个逻辑,你也应该写等等......我相信,为了学习,最好也展示传统方式(根据最佳实践)——所以我添加了评论,也针对其他读者,而不仅仅是问题的作者amountTree = amountTree + 1;
2赞
Jack M
9/22/2023
#3
好的,谢谢大家的帮助,真的很感谢社区。
从这里学到了一些好东西,比如不要在循环中返回,而我认为自动装箱的概念超出了我的联盟 atm(但现在不知道不要将 .equals() 与原语一起使用)。
我在您的建议的帮助下解决了这个问题:
public static int countTrue(boolean[] arr) {
int amountTrue = 0;
for (boolean i : arr){
if (i == true) {
amountTrue+=1;
}} return amountTrue;
}
}
评论
0赞
Jack M
9/22/2023
如果有人好奇,我正在 edabit 网站上做编码挑战。
1赞
user85421
9/22/2023
无需将任何布尔表达式与 ( 与 just 相同true
i == true
i
)
0赞
Robby Cornelissen
9/22/2023
并养成正确格式化代码的习惯。它将为您节省很多麻烦。
评论
return
boolean[]
true
if (arr.equals(true))
arr
true
i
if (i) { amountTrue++; }