java《字符串进阶篇》--习题逐语句分析及认识链式编程

一、前言

字符串相关的习题分享,随着学习的深入,应该要多做一些习题来巩固知识点,而不是一味的去学习新的东西。这几天尽可能地去给大家分享一些常用的方法及习题的讲解,希望大家认真观看,每一道题都有对应的分析。基础不好的小伙伴可以先看看基础篇。

java字符串练习基础篇

二、链式编程

链式编程(Chaining)是一种编程风格,通常用于使代码更加简洁和易读。在Java中,链式编程通常与构建器模式(Builder Pattern)结合使用,这种模式允许你按照一定的顺序设置对象的属性或调用方法,并且可以在不断调用方法的过程中返回对象本身(this),以便进行后续的方法调用。

示例

假设我们有一个简单的类 Person,具有几个属性:nameageaddress。我们希望能够通过链式调用来设置这些属性。

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 转换为普通的字符串并返回。

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值