【问题标题】:Java boolean method, for loop not returning proper true or false [closed]Java布尔方法,for循环不返回正确的真或假[关闭]
【发布时间】:2019-07-15 22:56:23
【问题描述】:
public static boolean oneNumeric(String s) {
    String[] digit = {"0","1", "2", "3", "4", "5", "6" ,"7", "8", "9"};
    boolean numeric = true;
    for (int i=0; i< s.length(); i++) {
        if(!(s.contains(digit[i]))) {
                return false;
    }}
    return numeric;

}

我想在我的 main 方法中返回 true 或 false,但它在 for 循环中不起作用。我糊涂了。

我做错了什么?

【问题讨论】:

  • 目的是检查是否只有数字?
  • 目的是检查用户输入(字符串)中是否至少有一位数字
  • “至少一位” if((s.contains(digit[i]))) { return true; ..
  • 由于i 用于索引digit,循环应该是i &lt; digit.length,而不是i&lt; s.length()
  • 嗯...请不要删除你的整个问题?

标签: java methods boolean


【解决方案1】:

您正在数字数组上使用字符串 s 的索引。交换它们在代码中的位置:digit.contains(s[i])

附带说明,您可能应该使用现有的库方法,而不是自己构建。

【讨论】:

  • digit 是一个数组。它没有contains 方法。 --- sString,所以 s[i] 无效。
  • 在这种情况下循环数字数组。
【解决方案2】:

问题

您的解决方案中的问题是:

   for (int i = 0; i < s.length(); i++) {
       if(!(s.contains(digit[i]))) {
           return false;
       }
   }

基本上,您正在使用索引i 遍历字符串s,但同时使用i 访问数组中的数字

解决方案

如果任务是检查字符串是否包含至少一个数字,这里有几个解决方案:

  1. Java 8 之前:
public static boolean oneNumeric(String input) {
    for (int i = 0; i < input.length(); i++) {
        if (Character.isDigit(input.charAt(i))) {
            return true;
        }
    }
    return false;
}

  1. Java 8 后:
public static boolean oneNumeric(String input) {
    return input.chars().mapToObj(c -> (char) c).anyMatch(Character::isDigit);
}

【讨论】:

    【解决方案3】:

    这听起来像是一个家庭作业问题,所以我不会用勺子喂食。您的问题不是很清楚,所以我假设您正在创建一种方法来检查字符串是否有至少一个数字

    执行此操作的更简洁(以及更好的 IMO)方法是遍历每个字符并检查其 ASCII 值是否在数字范围内。您可以找到一个 ASCII 表 here。请注意,数字的 ASCII 值是 48-57(含)。伪代码如下:

    for each character {
        if NOT(char btwn 48-57)
            return false
    }
    return true
    

    【讨论】:

      【解决方案4】:

      我看到了两个问题。循环中的返回和 i

      public static boolean oneNumeric(String s) {
          String[] digit = {"0","1", "2", "3", "4", "5", "6" ,"7", "8", "9"};
          boolean numeric = false;
          for (int i=0; i< digit.length; i++) {
              if(s.contains(digit[i])) {
                      numeric = true;
              }
          }
          return numeric;
      }
      

      【讨论】:

        【解决方案5】:

        为了使你的方法正确,你应该

        • 删除无用的numeric变量
        • 在访问digit 数组时使用digit.length 作为上限
        • 删除!并返回true

        它将检查每个数字是否存在于字符串中,如果字符串中没有人,则返回false

        public static boolean oneNumeric(String s) {
            String[] digit = {"0","1", "2", "3", "4", "5", "6" ,"7", "8", "9"};
            for (int i=0; i< digit.length; i++) {
                if(s.contains(digit[i])) {
                        return true;
                }
            }
            return false;    
        }
        

        但更简单的方法是:

        public static boolean oneNumeric(String s) {
            return s.matches(".*\\d.*");              //  '\d' is for digit in regex 
        }
        

        【讨论】:

        • digit 数组完全是多余的。同样使用contains,您实际上是对字符串s 执行线性扫描 - 所以本质上,在最坏的情况下,您将执行10 次遍历而不是单次遍历字符串。
        • @Zgurskyi 我并不是说它这么好,只是向 OP 纠正和解释,以便他改进它的功能
        • 另外,关于matches 提出的解决方案:String.matches 每次执行时都必须重新编译正则表达式,因此运行该行代码的次数越多,它就会变得越浪费。如果有人寻找合适的方法 - 如果您经常检查字符串中的数字,我不建议使用 String.matches。
        • @azro 明白了。然后提一下,用contains不好,以后OP可以改进。
        【解决方案6】:

        您必须遍历数组digit

        public static boolean oneNumeric(String s) {
            String[] digit = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
            for (int i = 0; i < digit.length; i++) {
                if (s.contains(digit[i]))
                    return true;
            }
            return false;
        }
        

        如果s 包含digit 的任何项,则返回true

        【讨论】:

          【解决方案7】:

          有不止一个错误。首先,数组长度是通过不带 () 的长度计算出来的,因为它是数组的属性,而不是方法。此外,您正在使用 s 长度的索引循环数组数字。 要检查字符串是否为数字,最好的方法是处理异常。 这是更正后的代码:

          public static boolean oneNumeric(String s) {
            try {  
              double d = Double.parseDouble(s);  
            } catch(NumberFormatException nfe) {  
              return false;  
            }  
            return true;
          }
          

          【讨论】:

            猜你喜欢
            • 2022-10-05
            • 2011-01-23
            • 1970-01-01
            • 2014-12-10
            • 2016-03-15
            • 1970-01-01
            • 2020-01-21
            • 2017-09-12
            • 1970-01-01
            相关资源
            最近更新 更多