-1

我有下面的代码,我想从键盘输入并显示输入是否连续包含 2 个数字。如果是这样,我想false在控制台中打印出来,否则true. 它工作正常,除非输入的前 2 个字符是数字。在那种情况下,我仍然进入true控制台。谁能明白为什么?提前致谢

import java.util.Scanner;
public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System. in );
        System.out.println("Enter:");
        String s = sc.nextLine();
        if (checkDigit(s)) {
            System.out.println("false");
        } else {
            System.out.println("true");
        }
    }
    public static boolean checkDigit(String s) {
        boolean b = true;
        char[] c = s.toCharArray();
        for (int i = 0; i < c.length - 1; i++) {
            if (Character.isDigit(c[i]) && Character.isDigit(c[i + 1])) {
                b = true;
            } else {
                b = false;
            }
        }
        return b;
    }
}
4

4 回答 4

2

即使您已经找到了结果,您仍会继续检查输入字符串。正如@Stultuske所指出的,您会覆盖变量的值,因此如果最后两个字符是数字b,您的代码只会返回。true

如果连续有两位数,则需要从循环中返回:

 public static boolean checkDigit(String s) {
    char[] c = s.toCharArray();

    for(int i=0; i < c.length-1; i++) {
        if(Character.isDigit(c[i]) && Character.isDigit(c[i+1])) {
            return true;
        }
    }

    return false;
 }

更新:事实上,片段中有一个错误,因为它从循环中返回得太早了。现在修好了。

于 2018-06-07T13:32:49.583 回答
1

问题是您会在每次循环迭代时覆盖该值,因此只有在最后一对字符匹配时才会为真。但是Krypt1 已经说过了

使用流的替代实现(因为现在所有的孩子都想使用流):

return IntStream.range(0, str.length()-1)
    .anyMatch(i -> Character.isDigit(str.charAt(i)) && Character.isDigit(str.charAt(i+1)));
于 2018-06-07T13:55:10.787 回答
0

在if条件中使用Character.isDigit(char)方法并返回 true;而不是存储 b=true ,因为它可能会在下一次迭代中被覆盖。

你也可以使用正则表达式。用于此目的的字符串匹配(模式)方法。

于 2018-06-07T14:27:22.517 回答
0

尝试使用以下正则表达式

Pattern pattern = Pattern.compile("[0-9]{2}");
Matcher matcher =  pattern.matcher("your input string");
于 2018-06-07T14:27:56.633 回答