You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Java Scanner中正确输入内容的显示颜色?

Java控制台输入内容变色解决方案

核心问题分析

你当前的思路是对的——通过ANSI转义码实现控制台文本变色,但需要调整实现逻辑,避免将带颜色代码的字符串存入集合,同时确保转义码定义正确。

可行优化建议

  • 定义正确的ANSI颜色转义码
    先在代码中明确绿色和重置的转义常量(你的bien应该对应这个绿色常量):

    public static final String ANSI_GREEN = "\u001B[32m";
    public static final String ANSI_RESET = "\u001B[0m";
    public static final String ANSI_RED = "\u001B[31m"; // 错误提示用红色
    
  • 调整输出与存储逻辑
    不要把带颜色代码的字符串存入acertadas集合(否则后续打印集合时会重复显示颜色代码),应该验证通过后直接打印带颜色的输入内容,再存储原始字符串:

    if(reservadas.contains(palabras)) {
        // 先打印绿色的正确保留字
        System.out.println(ANSI_GREEN + palabras + ANSI_RESET);
        // 存入原始字符串,保证集合数据纯净
        acertadas.add(palabras);
        contador++;
    }
    
  • 优化Scanner实例创建
    循环内反复创建Scanner会浪费资源,把实例移到循环外初始化:

    Scanner scanner = new Scanner(System.in);
    while (repetir || contador == max) {
        String palabras = scanner.nextLine().toLowerCase();
        // 后续逻辑...
    }
    scanner.close(); // 循环结束后关闭资源
    
  • 处理控制台兼容性
    部分Windows默认CMD不支持ANSI转义码,可通过以下方式解决:

    • 改用PowerShell运行程序(原生支持ANSI)
    • 添加JVM启动参数:-Dconsole.encoding=UTF-8
    • 若需兼容旧版Windows,可使用Jansi第三方库处理颜色

修改后的完整代码示例

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

public class ReservedWordPractice {
    public static final String ANSI_GREEN = "\u001B[32m";
    public static final String ANSI_RED = "\u001B[31m";
    public static final String ANSI_RESET = "\u001B[0m";

    public static void main(String[] args) {
        boolean repetir = true;
        int contador = 0;
        int max = 0;
        List<String> acertadas = new ArrayList<>();
        // 预定义Java所有保留字集合
        List<String> reservadas = List.of("abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum", "extends", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while");

        Scanner scanner = new Scanner(System.in);
        while (repetir || contador == max) {
            String palabras = scanner.nextLine().toLowerCase();
            
            if (palabras.contains(".")) {
                System.out.println("Has acertado las siguientes palabras: " + acertadas);
                repetir = false;
            } else {
                if(reservadas.contains(palabras)) {
                    System.out.println(ANSI_GREEN + palabras + ANSI_RESET);
                    acertadas.add(palabras);
                    contador++;
                } else {
                    System.out.println(ANSI_RED + "No es correcto" + ANSI_RESET);
                }
                if (contador == 50) {
                    System.out.println("ENHORABUENA!!!");
                    System.out.println("Has acertado todas las palabras reservadas");
                    repetir = false;
                }
            }
        }
        scanner.close();
    }
}

内容的提问来源于stack exchange,提问作者Ivan Parra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:15:33