一、前言
字符串相关的习题分享,随着学习的深入,应该要多做一些习题来巩固知识点,而不是一味的去学习新的东西。这几天尽可能地去给大家分享一些常用的方法及习题的讲解,希望大家认真观看,每一道题都有对应的分析。基础不好的小伙伴可以先看看基础篇。
java字符串练习基础篇
二、链式编程
链式编程(Chaining)是一种编程风格,通常用于使代码更加简洁和易读。在Java中,链式编程通常与构建器模式(Builder Pattern)结合使用,这种模式允许你按照一定的顺序设置对象的属性或调用方法,并且可以在不断调用方法的过程中返回对象本身(this),以便进行后续的方法调用。
示例
假设我们有一个简单的类 Person
,具有几个属性:name
、age
和 address
。我们希望能够通过链式调用来设置这些属性。
public class Person {
private String name;
private int age;
private String address;
// Setter methods with chainable return type
public Person name(String name) {
this.name = name;
return this;
}
public Person age(int age) {
this.age = age;
return this;
}
public Person address(String address) {
this.address = address;
return this;
}
// toString method to print Person details
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
// Example of using chainable setters
public static void main(String[] args) {
Person person = new Person()
.name("Alice")
.age(30)
.address("123 Main St, City");
System.out.println(person);
}
}
解析
-
Setter 方法的返回类型:在上面的示例中,
name(String name)
、age(int age)
和address(String address)
方法返回Person
类型的对象(即this
),使得可以在调用这些方法后立即调用对象的下一个方法。 -
链式调用:在
main
方法中,我们创建了一个Person
对象,并通过链式调用的方式设置其属性。首先调用name()
方法设置名字,然后调用age()
方法设置年龄,最后调用address()
方法设置地址。每次调用方法后,返回的是Person
对象本身,因此可以直接跟随另一个方法调用。 -
toString 方法:重写
toString()
方法以便打印Person
对象的详细信息。
优点
-
简洁性:通过链式调用,可以在一行代码中完成多个属性的设置,使代码更加紧凑和易读。
-
可读性:链式调用的代码结构更接近自然语言的表达方式,易于理解。
注意事项
-
可变性:链式编程通常会改变对象的状态,因此要确保对象在链式调用之后仍然保持有效状态。
-
方法设计:要确保每个方法返回正确的对象类型(通常是
this
或者对象本身),以便支持链式调用。
三、习题分析
1. 金额转换
public static void main(String[] args) {
//练习一:金额转换
Scanner sc = new Scanner(System.in);
System.out.println("请输入金额");
int n = sc.nextInt();
String[]str={"零","零","零","零","零","零","零"};
int count=7;
if(n<=0 || n>=9999999){
System.out.println("输入金额无效");
}else {
while (n > 0) {
count -= 1;
int m = n % 10;
if (m == 1) {
str[count] = "壹";
} else if (m == 2) {
str[count] = "贰";
} else if (m == 3) {
str[count] = "叁";
} else if (m == 4) {
str[count] = "肆";
} else if (m == 5) {
str[count] = "伍";
} else if (m == 6) {
str[count] = "陆";
} else if (m == 7) {
str[count] = "柒";
} else if (m == 8) {
str[count] = "捌";
} else if (m == 9) {
str[count] = "玖";
}
n /= 10;
}
}
System.out.println(str[0]+'佰'+str[1]+'拾'+str[2]+'万'+str[3]+'仟'+str[4]+'佰'+str[5]+'拾'+str[6]+'元');
}
初始化数组和计数器:
- 创建了一个长度为 7 的字符串数组
str
,用于存储金额的中文大写形式。初始值为全是 "零",表示初始情况下金额为零。 count
变量初始化为 7,用来作为数组str
的索引,从后往前填充。
金额有效性检查:
- 如果输入的金额
n
小于等于 0 或者大于等于 9999999,则输出 "输入金额无效"。
金额转换核心逻辑:
- 使用
while
循环对输入的金额n
进行处理,直到n
变为 0。 - 每次循环中,取
n
的个位数m
,并根据m
的值从 1 到 9,将对应的中文大写数字存入数组str
中。
输出结果:
- 最后通过字符串拼接的方式将
str
数组的元素以 "佰拾万仟佰拾元" 的格式输出。
2. 手机号屏蔽
public static void main(String[] args) {
//练习二:手机号屏蔽
Scanner sc = new Scanner(System.in);
System.out.println("请输入手机号");
String s = sc.next();
String begin = s.substring(0, 3);
String end = s.substring(7);
System.out.println(begin+"****"+end);
}
截取部分字符串:
- 使用
substring
方法从字符串s
中提取出前三位和后四位,分别存储在begin
和end
变量中。 begin = s.substring(0, 3)
:截取从索引 0 到索引 3(不包含)的子字符串,即手机号的前三位。end = s.substring(7)
:截取从索引 7 到字符串末尾的子字符串,即手机号的最后四位。
输出结果:
- 使用
println
方法将屏蔽后的手机号输出,中间四位用****
代替。
3. 身份证信息查看
public static void main(String[] args) {
//练习三:身份证信息查看
Scanner sc = new Scanner(System.in);
System.out.println("请输入身份证号码");
String s = sc.next();
System.out.println("您的信息为:");
System.out.println("出生年月日:"+s.substring(6,10)+"年"+s.substring(10,12)+"月"+s.substring(12,14)+"日");
char s1 = s.charAt(16);
if(s1=='1'){
System.out.println("性别为:"+"男");
}else{
System.out.println("性别为:"+"女");
}
}
提取出生日期:
- 使用
substring
方法从身份证号码中提取出出生年月日:s.substring(6, 10)
:提取从索引 6 到索引 10(不包含)的子字符串,即出生年份。s.substring(10, 12)
:提取从索引 10 到索引 12(不包含)的子字符串,即出生月份。s.substring(12, 14)
:提取从索引 12 到索引 14(不包含)的子字符串,即出生日。
提取性别信息:
- 使用
charAt
方法提取身份证号码中的第 17 位字符,这一位表示性别: - 如果
s.charAt(16)
是 '1',则性别为男性。 - 否则,性别为女性。
输出结果:
- 使用
println
方法将出生日期和性别信息分别打印输出。
4. 敏感词替换
public static void main(String[] args) {
//练习四:敏感词替换
String talk = "你玩的很好,以后别再玩了,TMD";
//敏感词
String[] arr={"TMD","CNM","SB","MLGB"};
for (int i = 0; i < arr.length; i++) {
talk = talk.replace(arr[i],"***");
}
System.out.println(talk);
}
定义字符串和敏感词数组:
String talk = "你玩的很好,以后别再玩了,TMD";
:定义了一个包含敏感词的字符串talk
。String[] arr = {"TMD", "CNM", "SB", "MLGB"};
:定义了一个包含多个敏感词的字符串数组arr
。
敏感词替换逻辑:
- 使用
for
循环遍历敏感词数组arr
中的每个敏感词。 - 调用
String.replace()
方法将talk
字符串中的每个敏感词替换为***
。 - 替换过程中,如果
talk
中包含敏感词,则将其全部替换为***
。
输出结果:
- 最后使用
System.out.println(talk);
将替换后的结果输出到控制台。
5. 对称字符串
public static void main(String[] args) {
//练习五:对称字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String s = sc.next();
String result = new StringBuilder(s).reverse().toString();
if(result.equals(s)){
System.out.println("该字符串是对称的");
}else{
System.out.println("该字符串不对称");
}
}
用户输入:
Scanner sc = new Scanner(System.in);
:创建了一个 Scanner 对象sc
,用于从标准输入(键盘)读取用户输入。System.out.println("请输入一个字符串");
:打印提示信息,提示用户输入一个字符串。String s = sc.next();
:通过sc.next()
方法获取用户输入的字符串并存储在变量s
中。
对称判断逻辑:
String result = new StringBuilder(s).reverse().toString();
:通过StringBuilder
将字符串s
反转,并将反转后的结果转换为字符串并赋给result
变量。if(result.equals(s)) { ... } else { ... }
:使用equals()
方法比较result
和原始字符串s
是否相等。- 如果相等 (
result.equals(s)
),则输出"该字符串是对称的"
。 - 如果不相等,则输出
"该字符串不对称"
。
- 如果相等 (
6. 拼接字符串
主函数 (main
方法):
public static void main(String[] args) {
int[] arr = {1, 2, 3};
System.out.println(arrToString(arr));
}
- 创建了一个整数数组
arr
,包含元素{1, 2, 3}
。 - 调用
arrToString(arr)
方法将数组转换为字符串并打印输出。
辅助函数 (arrToString
方法):
public static String arrToString(int[] arr){
StringBuilder str = new StringBuilder();
str.append("["); // 添加字符串开头的 [
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
str.append(arr[i]); // 如果是数组最后一个元素,则直接添加元素值
} else {
str.append(arr[i] + ","); // 如果不是最后一个元素,添加元素值后跟逗号
}
}
str.append("]"); // 添加字符串结尾的 ]
return str.toString(); // 将 StringBuilder 转换为普通的字符串并返回
}
- 创建了一个
StringBuilder
对象str
,用于构建最终的字符串。 - 在字符串开头添加
[
,表示数组的开始。 - 使用
for
循环遍历整数数组arr
:- 如果当前元素是数组的最后一个 (
i == arr.length - 1
),则直接将元素值添加到StringBuilder
中。 - 如果不是最后一个元素,则将元素值加上逗号
,
后添加到StringBuilder
中。
- 如果当前元素是数组的最后一个 (
- 在循环结束后,添加
]
,表示数组的结束。 - 最后,通过
str.toString()
方法将StringBuilder
转换为普通的字符串并返回。