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

news2024/11/13 21:47:18

一、前言

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1926276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GAMMA数据处理(八)

新学习了一个命令&#xff1a; SLC_cat_ScanSAR - Concatenate sequential ScanSAR burst SLC images (Sentinel-1, TSX, RCM...)&#xff0c;做数据拼接的。之前一直没有涉及到拼接问题&#xff0c;就一直没管。如果研究区包含两景SLC&#xff0c;可以拼接成一景。但是不知道…

计算机丢失CH375DLL怎么办,CH375DLL.DLL;计算机找不到CH375DLL怎么办,CH375DLL.DLL

翻遍CSDN&#xff0c;发现的文章不是只有描述不给资源&#xff0c;要不就是资源收费。 真是狗屎啊&#xff1b; 在千辛万苦找到资源后&#xff0c;我决定写一篇&#xff1b; 首先是资源文件下载 我上传的&#xff1a;&#xff08;肯定是0积分&#xff0c;如果收费了告诉我&…

Nuxt.js 错误侦探:useError 组合函数

title: Nuxt.js 错误侦探&#xff1a;useError 组合函数 date: 2024/7/14 updated: 2024/7/14 author: cmdragon excerpt: 摘要&#xff1a;文章介绍Nuxt.js中的useError组合函数&#xff0c;用于统一处理客户端和服务器端的错误&#xff0c;提供statusCode、statusMessage和…

IOT 可编程控制系统

IOT&#xff08;物联网&#xff09;可编程控制系统&#xff0c;如GF-MAXCC等&#xff0c;是一种集成了多种先进技术和功能的智能化控制设备&#xff0c;它能够在物联网系统中发挥关键作用&#xff0c;实现对多种设备的集中管理和控制。具体来说&#xff0c;IOT可编程控制系统的…

7天学会CANOpen

本系列文章&#xff0c;主要介绍CANOpen的学习知识&#xff0c;能够全面掌握CANOpen原理。文章会不定期的更新。 学习基础&#xff1a;CAN通信。 1. CANOpen通信协议1 2. CANOpen对象字的理解 3. CANOpen之CAN-ID、NODE-ID、COB-ID 4. CanOpen报文类型 5. CANO报文---SDO…

python 怎样生成窗体

通过import tkinter导入Tkinter模块&#xff0c;没有这句下面的都不成立了。 wintkinter.Tk()&#xff0c;这句是创建windows的窗口对象&#xff0c;注意后面的Tk&#xff0c;大小写。 win.title("窗口")&#xff0c;这段是设置窗口上的标题。 另外窗口的大小你可以通…

Paddle 打包部署

PaddleOCR 打包部署exe 心酸历程 PaddleOCR部署exe模式PaddleOCR安装到本地(稍后有时间再写)PaddleOCR打包过程异常问题记录&#xff01;&#xff01;&#xff01;&#xff01;No such file or directory: D:\\py_project\\paddleOCR\\dist\\paddleOCR\\_internal\\paddleocr\\…

JVM:垃圾回收器

文章目录 一、介绍二、年轻代-Serial垃圾回收器三、老年代-SerialOld垃圾回收器四、年轻代-ParNew垃圾回收器五、老年代-CMS&#xff08;Concurrent Mark Sweep&#xff09;垃圾回收器六、年轻代-Parllel Scavenge垃圾回收器七、Parallel Old垃圾回收器八、G1垃圾回收器 一、介…

《Python数据科学之五:模型评估与调优深入解析》

《Python数据科学之五&#xff1a;模型评估与调优深入解析》 在数据科学项目中&#xff0c;精确的模型评估和细致的调优过程是确保模型质量、提高预测准确性的关键步骤。本文将详细探讨如何利用 Python 及其强大的库进行模型评估和调优&#xff0c;确保您的模型能够达到最佳性能…

防火墙之NAT,智能选路篇

什么是NAT? 网络地址转换 1.静态NAT&#xff08;static NAT&#xff09;&#xff08;静态一对一映射&#xff09;&#xff1a;设置起来最为简单&#xff0c;内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址。多用于服务器场景。 2.动态NAT&#xff08;pool…

mavsdk_server安卓平台编译

1.下载好mavsdk并进入mavsdk目录 2.生成docker安卓平台文件 docker run --rm dockcross/android-arm64 >./dockcross-android-arm64 3.生成makefile ./dockcross-android-arm64 cmake -DCMAKE_BUILD_TYPERelease -DBUILD_MAVSDK_SERVERON -DBUILD_SHARED_LIBSOFF -Bbuild/…

Study--Oracle-07-ASM自动存储管理(二)

一、ASM安装准备条件 1、ASM支持存储类型 本地祼设备(本地的磁盘和分区) 网络附加存储(NAS) 存储区域网络(SAN) 2、ASM使用本地裸设备,要点: 已经被挂载到操作系统上或者已经做了分区 映射裸设备为文件名 设置正确的权限(针对grid用户和asmadmin组,权限为660) 二、OR…

如何用AI做副业?

无论是打工&#xff0c;还是创业&#xff0c;赚钱才是硬道理&#xff0c;拥有可持续的「睡后收入」才是我们孜孜不倦追求的目标。 一、职业四象限 1、E象限&#xff08;雇员象限&#xff09;、帮别人挣钱 E象限是雇员象限。别人给我们发工资&#xff0c;我们帮别人挣钱。这是风…

建立数据通路(三)

PC寄存器 背景 有了时钟信号&#xff0c;可以提供定时输入。有了D型触发器&#xff0c;可以在时钟信号控制的时间点写入数据把这两个功能组合起来&#xff0c;就可以实现一个自动计数器 程序计数器 加法器的两个输入&#xff0c;一个始终设置成1&#xff0c;另外一个来自于一…

关于Qt Creator 使用Qt Quick的Design模式设置

关于使用Qt Quick的Design模式设置&#xff1a; 如描述所言&#xff1a; 如果使用Design模式打开qml文件失败显示如下&#xff1a; 首先确认自己是否安装了Qt Design Studio 如果安装了仍然不显示&#xff0c;则需要勾选下面三个地方才能用Design模式打开.ui.qml文件&#…

Hologres+Flink企业级实时数仓核心能力介绍

讲师&#xff1a;骆撷冬 Hologres PD 随着业务发展&#xff0c;业务对于时效性的要求在逐渐提升。各种场景都需要实时&#xff0c;例如春晚实时直播大屏、双11 GMV实时大屏、实时个性化推荐等等多种场景&#xff0c;都对数据的时效性有着非常高的要求。随着实时需求的发展&…

【技术追踪】使用去噪扩散型进行 3D 血管图生成(MICCAI-2024)

graphs 图也可以用 diffusion 耶~ 本文提出了第一个去噪扩散模型在 3D 血管图生成中的工作&#xff0c;其是新颖的两阶段生成方法&#xff0c;依次对节点坐标和边进行去噪&#xff0c;在生成多样化、新颖且解剖学上合理的血管图方面性能表现出色。 论文&#xff1a;3D Vessel G…

pg-存储过程

1.概念和优势 2.代码块结构 do end之间俩个$$ declare用来声明定义变量&#xff0c;begin用来运行赋值 notice输出 3.变量使用

java语法(分支,方法,递归);Debug使用

java语法 x 操作符 ->分支&#xff0c;循环&#xff0c;方法 分支 条件的三种if if if…else… public class IfDemo01 { public static void main(String[] args) { int a 3; final int DAY 3; if(a<DAY){ }else if (a<…

c语言中的字符串函数

strstr函数 函数介绍 strstr 用于在一个字符串中查找另一个字符串的首次出现。 我们来看这个函数的参数名字&#xff1a;haysytack&#xff08;干草堆&#xff09;needle&#xff08;针&#xff09;,这个其实就是外国的一句谚语&#xff1a;在干草堆中找一根针&#xff0c;就…