繁体   English   中英

如何检查 System.in 是否仅包含数字

[英]How to check if the System.in contains only numbers

有一个任务从控制台获取 N 个数字,找到最长和最短的数字及其长度。 该任务并不困难并且可以正常工作,但是我决定检查一下控制台输入是否符合任务的条件:

  • 是否只有 Integer 编号。
  • 正好是 N 个数字,而不是更多/更少。

我决定编写一个 boolean 方法 isInputCorrect(),它会使用 Scanner 并检查输入是否正确,但它不能正常工作。

public static void main(String[] args) {
        int n = 5;
        Scanner sc = new Scanner(System.in);
        do {
            System.out.println("Hello, please enter " + n + " integer numbers:");
            while (!isInputCorrect(sc,n)){
                System.out.println("Wrong! Try again:");
                sc.next();
            }
        } while (!isInputCorrect(sc, 5));
        String scLine = sc.nextLine();
        String[] arr = scLine.split("\\s+");
        String maxLengthNum = arr[0];
        String minLengthNum = arr[0];
        for (int i = 1; i < arr.length; i++){
            if (maxLengthNum.length() < arr[i].length()){
                maxLengthNum = arr[i];
            }
            if (minLengthNum.length() > arr[i].length()){
                minLengthNum = arr[i];
            }
        }
        String equalMaxNum = "";
        String equalMinNum = "";
        int countMax = 0;
        int countMin = 0;
        for (String s : arr){
            if (maxLengthNum.length() == s.length()){
                countMax += 1;
                equalMaxNum += s + " ";
            }
            if (minLengthNum.length() == s.length()){
                countMin += 1;
                equalMinNum += s + " ";
            }
        }
        if (countMax > 1){
            System.out.println("The longest numbers are: " + equalMaxNum + " Their length is: " + maxLengthNum.length());
        }
        else {
            System.out.println("The longest number is: " + maxLengthNum + " Its length is: " + maxLengthNum.length());
        }
        if (countMin > 1){
            System.out.println("The shortest numbers are: " + equalMinNum + " Their length is: " + minLengthNum.length());
        }
        else {
            System.out.println("The shortest number is: " + minLengthNum + " Its length is: " + minLengthNum.length());
        }
    }
    public static boolean isInputCorrect(Scanner sc, int n){
        boolean flag = true;
        for (int i = 0; i < n; i++){
            if (sc.hasNextInt()){
                sc.next();
            }else {
                flag = false;
                break;
            }
        }
        return flag;
    }

编辑此代码仍然不起作用。 我意识到,问题出在 isDigit() 中。 并且在最后一个 if 语句中完全符合常规条件。 它是这样的:

public static boolean isDigit (String input, int n){
    String[] arr = input.split("\\s+");
    boolean flag = false;
    if (arr.length != n){
        flag = false;
    }
    else {
        for (String s : arr) {
            if (s.startsWith("-")) {
                if (s.substring(1).matches("[0-9]*")) {
                    flag = true;
                }
            } else if (s.matches("[0-9]*")) {
                flag = true;
            } else {
                flag = false;
            }
        }
    }
    return flag;
}

此方法将控制台输入作为字符串,然后检查它包含多少个数字(字符串),是否有任何负数等等。 但它只能应用于子字符串(没有空格的单词)。 就我而言,它可以应用于 arr[i]。

所以我修改它以将 String 拆分为 array[] 并尝试检查每个元素。 我有:

public static boolean isDigit (String input, int n){
    String[] arr = input.split("\\s+");
    boolean flag = false;
    if (arr.length != n){
        flag = false;
    }
    else {
        for (String s : arr) {
            if (s.startsWith("-")) {
                if (s.substring(1).matches("[0-9]*")) {
                    flag = true;
                }
            } else if (s.matches("[0-9]*")) {
                flag = true;
            } else {
                flag = false;
            }
        }
    }
    return flag;
}

但即使输入为:1 3213 w 15 3 我也无法理解,它返回 true,有什么问题? 完整的代码是:

public static void main(String[] args) {
            int n = 5;
            boolean validInput = false;
            String input;
            do {
                System.out.println("Please enter " + n + " integer numbers:");
                Scanner sc = new Scanner(System.in);
                input = sc.nextLine();
                if (isDigit(input, n)) {
                    validInput = true;
                } else {
                    System.out.println("Wrong input! Try again: ");
                }
            }
            while (!validInput);
    
            String[] arr = input.split("\\s+");
    
            String maxLengthNum = arr[0];
            String minLengthNum = arr[0];
            for (int i = 1; i < arr.length; i++){
                if (maxLengthNum.length() < arr[i].length()){
                    maxLengthNum = arr[i];
                }
                if (minLengthNum.length() > arr[i].length()){
                    minLengthNum = arr[i];
                }
            }
    
            String equalMaxNum = "";
            String equalMinNum = "";
    
            int countMax = 0;
            int countMin = 0;
    
            for (String s : arr){
                if (maxLengthNum.length() == s.length()){
                    countMax += 1;
                    equalMaxNum += s + " ";
                }
                if (minLengthNum.length() == s.length()){
                    countMin += 1;
                    equalMinNum += s + " ";
                }
            }
            if (countMax > 1){
                System.out.println("The longest numbers are: " + equalMaxNum + " Their length is: " + maxLengthNum.length());
            }
            else {
                System.out.println("The longest number is: " + maxLengthNum + " Its length is: " + maxLengthNum.length());
            }
            if (countMin > 1){
                System.out.println("The shortest numbers are: " + equalMinNum + " Their length is: " + minLengthNum.length());
            }
            else {
                System.out.println("The shortest number is: " + minLengthNum + " Its length is: " + minLengthNum.length());
            }
        }
    
        public static boolean isDigit (String input, int n){
        String[] arr = input.split("\\s+");
        boolean flag = false;
        if (arr.length != n){
            flag = false;
        }
        else {
            for (String s : arr) {
                if (s.startsWith("-")) {
                    if (s.substring(1).matches("[0-9]*")) {
                        flag = true;
                    }
                } else if (s.matches("[0-9]*")) {
                    flag = true;
                } else {
                    flag = false;
                }
            }
        }
        return flag;
    }

解决了

谢谢大家,你们的帮助真的很有用。 我终于找到了问题它在 isDigit() 方法中。 它正在检查数组的每个元素,并根据最后的结果切换一个标志。 我写了“break”来停止进一步检查循环中是否至少有一个错误标志。

public static boolean isDigit (String input, int n){
        String[] arr = input.split("\\s+");
        boolean flag = false;
        if (arr.length != n){
            flag = false;
        }
        else{
            for (String s: arr){
                if (s.startsWith("-")) {
                    if (s.substring(1).matches("[0-9]*")){
                        flag = true;
                    }
                    else {
                        flag = false;
                        break;
                    }
                }
                else {
                    if (s.matches("[0-9]*")){
                        flag = true;
                    }
                    else {
                        flag = false;
                        break;
                    }
                }
            }
        }
        return flag;
    }

您可以使用正则表达式来验证输入是否仅包含 integer 数字:

int n = 5;
// ... your current code

String scLine = sc.nextLine();
if (!scLine.matches("\\d+(?:\\s+\\d+)*")) {
    throw new IllegalArgumentException("input contained non-integers");
}

String[] arr = scLine.split("\\s+");
if (arr.length != n) {
    throw new IllegalArgumentException("found " + arr.length + " number inputs but expected " + n + ".");
}

您可以检查输入字符串是否只有数字,如下所示

public  boolean isDigit(String input) {

        if (input == null || input.length() < 0)
            return false;
        input = input.trim();
        if ("".equals(input))
            return false;
        if (input.startsWith("-")) {
            return input.substring(1).matches("[0-9]*");
        } else {
            return input.matches("[0-9]*");
        }
    }

编辑:

允许用户重新输入,直到输入有效数字

boolean validInput = false;
do
{
  System.out.println("Enter the number ");
   // get user input
   String input  sc.nextLine();
  if(isDigit(input))
    validInput  = true;
  else
    System.out.println("Enter valid Number");
}
while (!validInput );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM