创建一个函数,该函数返回数组中 true 值的数量

Create a function which returns the number of true values there are in an array

提问人:Jack M 提问时间:9/22/2023 更新时间:9/22/2023 访问量:83

问:

代码编译,但始终返回 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 每个循环。

java 循环 for-loop foreach

评论

0赞 Jorn 9/22/2023
不要在循环内return
0赞 deHaar 9/22/2023
A 永远不会是 ,所以在 ...boolean[]trueif (arr.equals(true))
0赞 Robby Cornelissen 9/22/2023
您正在将数组与 进行比较,而不是将值 进行比较。就这样。arrtruei
0赞 Robby Cornelissen 9/22/2023
@Jorn我纠正了。
0赞 experiment unit 1998X 9/22/2023
将 if else 语句替换为if (i) { amountTrue++; }

答:

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)比较或(不需要比较任何布尔表达式(例如)与{相同,只是ibooleanBooleantrueBoolean.TRUEequals==trueBoolean.TRUEitruex == truex} )
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
这里没有必要将任何布尔表达式(例如)与 { 进行比较,就像任何表达式一样itruex == truexx}
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 相同truei == truei)
0赞 Robby Cornelissen 9/22/2023
并养成正确格式化代码的习惯。它将为您节省很多麻烦。