编辑代码

package com.example.lottery;

import java.util.*;
import java.util.stream.Collectors;

public class SSQAnalyzer {
    private static final String HISTORY_DATA = """
        
04 11 15 24 25 33  15
06 07 09 13 21 27  05
04 14 16 23 24 30  14
07 11 13 18 27 31  11
06 13 17 22 24 29  11
04 06 07 16 17 21  08
02 04 11 12 23 25  06
09 14 16 17 25 33  11
07 08 14 18 21 27  11
01 07 08 17 20 22  06
10 16 19 27 28 30  09
03 07 17 27 29 32  04
10 19 20 26 28 29  15
09 12 13 15 22 26  11
02 03 17 18 22 33  16
        """;

    public static void main(String[] args) {
        try (Scanner sc = new Scanner(System.in)) {
            // 数据统计初始化不变... 

            // 新版输入提示
            System.out.println("请输入6个红球号码(1-33) + 蓝球号码(1-16)");
            System.out.print("格式示例:5 12 23 8 30 9  14\n> ");
            String input = sc.nextLine();

            // 强化格式验证
            if (!isValidFormat(input)) {
                System.err.println("输入格式错误!请确认:6个红球+双空格+蓝球");
                return;
            }

            // 优化后的解析逻辑
            BallNumbers nums = parseInput(input);
            if (nums == null) return;

            // 显示有效输入
            System.out.printf("已接收:红球%s | 蓝球%02d%n",
                nums.reds.stream().sorted().collect(Collectors.toList()),
                nums.blue);

            // 后续推荐逻辑不变...
        }
    }

    // 格式验证新实现
    private static boolean isValidFormat(String input) {
        // 允许开头结尾的空格
        return input.trim().matches(
            "(\\d{1,2}\\s+){5}\\d{1,2}  \\d{1,2}"
        );
    }

    // 输入解析新实现
    private static BallNumbers parseInput(String input) {
        try {
            String[] parts = input.trim().split("  +"); // 两个以上空格分隔
            
            // 提取红球部分
            List<Integer> reds = Arrays.stream(parts[0].split("\\s+"))
                    .map(Integer::parseInt)
                    .collect(Collectors.toList());

            // 校验红球数量和范围
            if (reds.size() != 6 || reds.stream().anyMatch(n -> n < 1 || n > 33)) {
                System.err.println("红球应为6个1-33的不同号码");
                return null;
            }

            // 校验重复值
            Set<Integer> uniqueReds = new HashSet<>(reds);
            if (uniqueReds.size() != 6) {
                System.err.println("红球号码存在重复");
                return null;
            }

            // 解析蓝球
            int blue = Integer.parseInt(parts[1].trim());
            if (blue < 1 || blue > 16) {
                System.err.println("蓝球应为1-16的数字");
                return null;
            }

            return new BallNumbers(reds, blue);
        } catch (Exception e) {
            System.err.println("输入解析错误:" + e.getMessage());
            return null;
        }
    }

    // 数据对象封装
    private static class BallNumbers {
        List<Integer> reds;
        int blue;

        BallNumbers(List<Integer> reds, int blue) {
            this.reds = reds;
            this.blue = blue;
        }
    }

    // 其他方法保持不变...
}