Student ID Generator II


Submit solution

Points: 10 (partial)
Time limit: 1.0s
Memory limit: 64M

Authors:
Problem type
Allowed languages
Java 19, Java 8

題目說明

請撰寫一個 Java 程式,實現一個智慧型學生證號碼產生器。該程式會要求使用者持續輸入字串片段,直到集滿四個合法的數字片段為止,最後將這四個片段組合成一個學生證號碼並印出。

程式的運作規則

動態過濾輸入

  • 使用者會輸入多個字串片段(數量不固定,由空格或換行分隔)
  • 程式必須即時檢查每個片段

合法片段定義

  • 若字串片段可成功轉換為 0~9999 的整數(負數是不合法的),則視為合法片段
  • 將其轉為整數存入 ArrayList<Integer>
  • 若片段不到四個字元,最終組合時會自動補零(例如 68 補為 0068

非法片段處理

  • 若片段包含非法字元(例如 "123a")導致無法轉換為整數,程式必須默默忽略該片段
  • 不存入容器,且不中斷程式,繼續讀取下一個片段

終止條件

  • ArrayList<Integer> 內成功集滿四個合法整數時,程式應立即停止讀取輸入

輸出結果

  • 將這四個整數依據輸入順序,各自格式化為四位數(不足四位左邊補零)並拼接在一起
  • 最終印出一行 16 位數的學生證號碼

請利用下方的樣板程式碼為基礎,在標記 // TODO 的空格處填入關鍵程式碼以完成上述功能。


參考程式碼

import java.util.ArrayList;
import java.util.Scanner;

public class DynamicStudentIDGenerator {
    public static void main(String[] args) {
        // 取得集滿四個合法整數的容器
        ArrayList<Integer> validNumbers = getUserInput();

        // 組合並印出學生證號碼
        String studentID = buildStudentID(validNumbers);
        System.out.println(studentID);
    }

    // 持續讀取使用者輸入,自動忽略非法字串,直到集滿四個合法整數為止
    public static ArrayList<Integer> getUserInput() {
        Scanner scanner = new Scanner(System.in);

        // TODO: 建立一個適當的容器用於儲存整數型態的片段,命名為 validNumbers
        // TODO: 使用迴圈控制讀取,直到容器內「集滿四個元素」為止
        while (...) {
            String input = scanner.next();

            // TODO: 嘗試解析字串,若成功則加入容器,若失敗(發生例外)則默默忽略並繼續
        }

        scanner.close();
        return validNumbers;
    }

    // 將四個整數片段格式化為四位數並拼接
    public static String buildStudentID(ArrayList<Integer> numList) {
        String studentID = "";

        // TODO: 盤點 numList,將每個整數轉換為四位數(不足四位補零)並進行字串拼接
        for (...) {  // 迴圈內建立 num 變數
            studentID += String.format("%04d", num);
        }

        return studentID;
    }
}

輸入說明

  • 輸入一行包括多個字串片段,每個字串由空格分開
  • 保證至少有四個合法片段
  • 片段可能包括:
    • 合法整數(0~9999):123, 5, 9999, 0
    • 非法片段:123a, abc, -5, 10000, 12.5

輸出說明

  • 輸出該組合完成的字串(無空格、無分隔符號)
  • 總長度為 16 位數(四個四位數拼接)
  • 註:默默忽略每一個不合法的字串片段

範例測資

輸入1
123 abc 45 xyz 6789 10a 1 end 2
輸出1
0123004567890001
說明
  • 123 → 合法(整數 123),加入
  • abc → 非法(無法轉換為整數),忽略
  • 45 → 合法(整數 45),加入
  • xyz → 非法(無法轉換為整數),忽略
  • 6789 → 合法(整數 6789),加入
  • 10a → 非法(包含字母),忽略
  • 1 → 合法(整數 1),加入,集滿四個,停止讀取

組合過程:

  • 第1個片段 123 → 格式化為 0123
  • 第2個片段 45 → 格式化為 0045
  • 第3個片段 6789 → 格式化為 6789
  • 第4個片段 1 → 格式化為 0001
  • 拼接結果:0123004567890001(16位數)

輸入2
0 9999 -5 100 12.5 5000 test555 7 2024
輸出2
0000999901005000
說明
  • 0 → 合法(整數 0),加入
  • 9999 → 合法(整數 9999,邊界值),加入
  • -5 → 非法(負數),忽略
  • 100 → 合法(整數 100),加入
  • 12.5 → 非法(浮點數),忽略
  • 5000 → 合法(整數 5000),加入,集滿四個,停止讀取

組合過程:

  • 第1個片段 0 → 格式化為 0000
  • 第2個片段 9999 → 格式化為 9999
  • 第3個片段 100 → 格式化為 0100
  • 第4個片段 5000 → 格式化為 5000
  • 拼接結果:0000999901005000(16位數)

Comments

There are no comments at the moment.