【日耕一题】3. 通过键盘输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

你好,我是林森lsjs

欢迎来到日耕一题,跟着我。这道题是 Java 字符串处理、ASCII 码应用的入门题。

目录

一、题目完整解读

原题

输入格式

输出格式

输入样例

输出样例

拆解所有要求

二、核心知识点

[1. 输入:next () 和 nextLine () 的区别](#1. 输入:next () 和 nextLine () 的区别)

[错误输入写法(用 next ())](#错误输入写法(用 next ()))

[正确输入写法(用 nextLine ())](#正确输入写法(用 nextLine ()))

[2. 字符串遍历的两种方式](#2. 字符串遍历的两种方式)

[三、分步代码编写 + 逐行讲解](#三、分步代码编写 + 逐行讲解)

[1. 第一步:定义统计计数器](#1. 第一步:定义统计计数器)

[2. 第二步:正确读取整行输入](#2. 第二步:正确读取整行输入)

[3. 第三步:遍历字符串和分类判断逻辑](#3. 第三步:遍历字符串和分类判断逻辑)

[4. 第四步:按格式输出结果](#4. 第四步:按格式输出结果)

[四、完整可运行代码 + 逐行注释](#四、完整可运行代码 + 逐行注释)

五、执行流程全复盘(重点)

六、解法拓展

[解法 2](#解法 2)

[解法 3](#解法 3)

七、总结


一、题目完整解读

原题

7-13 通过键盘输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。统计一行字符串中的英文字母个数、空格个数、数字个数、其他字符个数

输入格式

通过键盘输入一行字符(可以包含任意字符:字母、数字、空格、特殊符号、中文都可以)

输出格式

严格按顺序输出:

复制代码
字母个数:X
数字个数:X
空格个数:X
其他字符个数:X

输入样例

复制代码
rwrwewre2345asdJSJQI%^&(&   *&sdf YY( 2342-k'

输出样例

复制代码
字母个数:22
数字个数:8
空格个数:5
其他字符个数:10

拆解所有要求

  1. 必须读一整行:空格、特殊符号都要完整读取,不能遇到空格就停
  2. 字符分类规则:
    • 英文字母:大小写都算,a-z、A-Z 都属于字母,不要漏了大写
    • 数字:0-9,纯数字
    • 空格:就是普通空格,制表符 \t、换行 \n 不算(题目只统计空格)
    • 其他:不属于上面三类的所有字符,包括特殊符号、中文、标点等等
  3. 输出格式必须完全匹配,文字、冒号、顺序都不能改,改了直接判错

二、核心知识点

1. 输入:next () 和 nextLine () 的区别

那有人就问了:我直接用 next () 读不行吗?为什么一定要用 nextLine ()?

错误输入写法(用 next ())
java 复制代码
Scanner sc = new Scanner(System.in);
String str = sc.next();
// 输入:a b 1 !
// 实际读到的只有:"a",遇到空格就停了,后面的b、1、空格、!全没读到
正确输入写法(用 nextLine ())
java 复制代码
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
// 输入:a b 1 !
// 完整读到:"a b 1 !",所有字符包括空格全读进去了

结论:

只要题目要求读一行、读带空格的字符串,必须用 nextLine (),绝对不能用 next () ,这是我们第一章讲的输入经典坑,90% 的新手这道题第一个错就错在这里。

2. 字符串遍历的两种方式

遍历就是把字符串的每一个字符挨个取出来,判断属于哪一类,有两种常用写法:

  1. 写法 1(最常用):charAt(下标),通过下标取字符,和数组遍历逻辑一样
  2. 写法 2:转成字符数组toCharArray(),遍历数组,后面拓展会讲
  3. 定义变量初始值为 0
  4. 每符合一次条件,变量 + 1
  5. 最后输出变量的值就是总数

三、分步代码编写 + 逐行讲解

1. 第一步:定义统计计数器

java 复制代码
// 四个计数器,分别统计四类字符,初始值必须是0
int letterCount = 0; // 统计英文字母个数
int numCount = 0;    // 统计数字个数
int spaceCount = 0;  // 统计空格个数
int otherCount = 0;  // 统计其他字符个数

为什么初始值必须是 0?不初始化不行吗?

初始值是 0:第一个符合条件的字符 + 1,结果就是 1,完全正确

如果不初始化:Java 局部变量没有默认值,编译直接报错

如果初始值写成 1:最后结果会多算 1,统计错误✅ 所有计数器类变量,初始值永远写 0!

2. 第二步:正确读取整行输入

java 复制代码
// 1. 创建Scanner输入工具,对应我们第一章输入三板斧
Scanner sc = new Scanner(System.in);
// 2. 用nextLine()读取一整行,包含所有空格、特殊字符
String str = sc.nextLine();

如果前面有 nextInt ()、next (),必须先加一行sc.nextLine()吃掉换行符,对应我们第一章讲的 nextLine 换行残留坑,这道题是直接读一行,所以不用。


3. 第三步:遍历字符串和分类判断逻辑

这是核心逻辑,我每一行都讲清楚:

java 复制代码
// 循环遍历字符串的每一个字符
// 字符串下标从0开始,最后一个下标是 长度-1,所以循环条件是i < str.length()
for (int i = 0; i < str.length(); i++) {
    // 取出当前下标i对应的单个字符
    char c = str.charAt(i);

    // 第一判断:是不是英文字母(大小写都算)
    if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
        letterCount++; // 是字母,字母计数器+1
    }
    // 第二判断:是不是数字
    else if (c >= '0' && c <= '9') {
        numCount++; // 是数字,数字计数器+1
    }
    // 第三判断:是不是空格
    else if (c == ' ') {
        spaceCount++; // 是空格,空格计数器+1
    }
    // 剩下的所有字符,都属于其他
    else {
        otherCount++; // 其他计数器+1
    }
}

4. 第四步:按格式输出结果

java 复制代码
// 严格按照题目要求的格式输出,文字、冒号、顺序都不能改
System.out.println("字母个数:" + letterCount);
System.out.println("数字个数:" + numCount);
System.out.println("空格个数:" + spaceCount);
System.out.println("其他字符个数:" + otherCount);

// 关闭输入流,对应第一章讲的sc.close(),好习惯
sc.close();

四、完整可运行代码 + 逐行注释

java 复制代码
// 导入Scanner输入包,第一章讲的输入导包
import java.util.Scanner;

public class CountChar {
    public static void main(String[] args) {
        // ========== 1. 初始化四个计数器,初始值0 ==========
        int letterCount = 0; // 英文字母计数器
        int numCount = 0;    // 数字计数器
        int spaceCount = 0;  // 空格计数器
        int otherCount = 0;  // 其他字符计数器

        // ========== 2. 读取整行输入 ==========
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine(); // 读一整行,包含空格

        // ========== 3. 遍历+分类统计 ==========
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i); // 取出当前字符

            // 判断字母(大小写)
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                letterCount++;
            }
            // 判断数字
            else if (c >= '0' && c <= '9') {
                numCount++;
            }
            // 判断空格
            else if (c == ' ') {
                spaceCount++;
            }
            // 其他字符
            else {
                otherCount++;
            }
        }

        // ========== 4. 按格式输出 ==========
        System.out.println("字母个数:" + letterCount);
        System.out.println("数字个数:" + numCount);
        System.out.println("空格个数:" + spaceCount);
        System.out.println("其他字符个数:" + otherCount);

        sc.close(); // 关闭输入流
    }
}

五、执行流程全复盘(重点)

我们拿样例输入的前 15 个字符,一个个走,彻底搞懂每一步怎么变:样例前 15 个字符:r w r w e w r e 2 3 4 5 a s d

  1. 程序启动,四个计数器初始化:letterCount=0, numCount=0, spaceCount=0, otherCount=0
  2. 读取完整输入字符串,存入str
  3. 开始循环遍历:
    • i=0,字符r:小写字母 → letterCount=1
    • i=1,字符w:小写字母 → letterCount=2
    • i=2,字符r:小写字母 → letterCount=3
    • i=3,字符w:小写字母 → letterCount=4
    • i=4,字符e:小写字母 → letterCount=5
    • i=5,字符w:小写字母 → letterCount=6
    • i=6,字符r:小写字母 → letterCount=7
    • i=7,字符e:小写字母 → letterCount=8
    • i=8,字符2:数字 → numCount=1
    • i=9,字符3:数字 → numCount=2
    • i=10,字符4:数字 → numCount=3
    • i=11,字符5:数字 → numCount=4
    • i=12,字符a:小写字母 → letterCount=9
    • i=13,字符s:小写字母 → letterCount=10
    • i=14,字符d:小写字母 → letterCount=11
    • ... 后面的字符依次判断,遇到空格spaceCount++,遇到特殊符号otherCount++
  4. 遍历完所有 45 个字符,最终四个计数器的值就是:22、8、5、10
  5. 按格式输出,程序结束

六、解法拓展

解法 2

转字符数组遍历(更接近 C 语言写法)

java 复制代码
// 把字符串转成字符数组
char[] arr = str.toCharArray();
// 遍历字符数组
for (char c : arr) {
    // 判断逻辑和之前完全一样
    if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
        letterCount++;
    }
    // ... 其余判断不变
}

解法 3

用 Character 工具类判断(不用记 ASCII)

java 复制代码
if (Character.isLetter(c)) { // 判断是不是字母
    letterCount++;
} else if (Character.isDigit(c)) { // 判断是不是数字
    numCount++;
} else if (c == ' ') {
    spaceCount++;
} else {
    otherCount++;
}

优点:不用记 ASCII 范围,直接用 Java 自带的工具类方法,新手也不会写错判断条件。

七、总结

  1. 输入处理:nextLine()读取带空格的整行字符串,避坑
  2. 字符串遍历:charAt()或转字符数组,逐个取字符
  3. 字符分类:ASCII 码判断或 Character 工具类,四类字符分别统计
  4. 计数器逻辑:符合条件 + 1,初始值为 0

++诸位共勉,无限学习!++

相关推荐
yzy851 小时前
数据同步工具 -- syncthing
开发语言
catchadmin1 小时前
PHP 应用 security.txt 漏洞披露实践
开发语言·php
糖果店的幽灵1 小时前
LangChain 1.3 完全教程:从入门到精通-Part 11: Tools(工具系统)
开发语言·langchain·c#
夜勤月1 小时前
AQS 与 ThreadPoolExecutor 深度拆解:JDK 高并发底层设计精髓
android·java·开发语言
luj_17682 小时前
R语言生态优势与学习曲线分析
c语言·开发语言·网络·经验分享·算法
phltxy2 小时前
Spring AI 应用开发
java·人工智能·spring
程序大视界2 小时前
【C++ 从基础到项目实战】C++(二):数组、字符串与结构体——组织数据的容器
开发语言·c++·cpp
码不停蹄的玄黓2 小时前
Arthas 线上问题排查实战:CPU过高、频繁GC
java
Michaelwubo2 小时前
swagger全集通+mock(prism)
java