你好,我是林森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
拆解所有要求
- 必须读一整行:空格、特殊符号都要完整读取,不能遇到空格就停
- 字符分类规则:
- 英文字母:大小写都算,a-z、A-Z 都属于字母,不要漏了大写
- 数字:0-9,纯数字
- 空格:就是普通空格,制表符 \t、换行 \n 不算(题目只统计空格)
- 其他:不属于上面三类的所有字符,包括特殊符号、中文、标点等等
- 输出格式必须完全匹配,文字、冒号、顺序都不能改,改了直接判错
二、核心知识点
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(最常用):
charAt(下标),通过下标取字符,和数组遍历逻辑一样 - 写法 2:转成字符数组
toCharArray(),遍历数组,后面拓展会讲 - 定义变量初始值为 0
- 每符合一次条件,变量 + 1
- 最后输出变量的值就是总数
三、分步代码编写 + 逐行讲解
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
- 程序启动,四个计数器初始化:
letterCount=0, numCount=0, spaceCount=0, otherCount=0 - 读取完整输入字符串,存入
str - 开始循环遍历:
- 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++
- i=0,字符
- 遍历完所有 45 个字符,最终四个计数器的值就是:22、8、5、10
- 按格式输出,程序结束
六、解法拓展
解法 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 自带的工具类方法,新手也不会写错判断条件。
七、总结
- 输入处理:
nextLine()读取带空格的整行字符串,避坑 - 字符串遍历:
charAt()或转字符数组,逐个取字符 - 字符分类:ASCII 码判断或 Character 工具类,四类字符分别统计
- 计数器逻辑:符合条件 + 1,初始值为 0
++诸位共勉,无限学习!++
