簡體   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