字符串基础练习

Java学习笔记(新手纯小白向)

第一章 JAVA基础概念

第二章 JAVA安装和环境配置

第三章 IntelliJ IDEA安装

第四章 运算符

第五章 运算符联系

第六章 判断与循环

第七章 判断与循环练习

第八章 循环高级综合

第九章 数组介绍及其内存图

第十章 数组基础练习

第十一章 方法基础及简单应用

第十二章 方法基础练习

第十三章 前续知识综合练习

第十四章 面向对象基础

第十五章 面向对象综合训练

第十六章 字符串基础

第十七章 字符串基础练习


目录

Java学习笔记(新手纯小白向)

前言

一、转换罗马数字

        1.需求

        2.参考答案

 二、字符串匹配

        1.需求

        2.参考答案

三、打乱字符串

        1.需求

        2.解题方案

        3.参考答案

四、验证码生成

        1.需求

        2.参考答案

五、字符统计

        1.需求

        2.解题方案 

        3.解题步骤

        4.参考答案

六、字符串对称

        1.需求

        2.解题方案

        3.解题步骤

        4.参考答案

七、身份证号码合法判断

        1.需求

        2.解题方案

        3.解题步骤

        4.参考答案

八、字符串拼接

        1.需求

        2.解题方案

        3.解题步骤

        4.参考答案

 九、统计某字符串在文本中出现的次数

        1.需求

        2.解题方案

        3.解题步骤

        4.参考答案

总结


前言

本篇章主要展示了常见的一些基础的字符串练习及解答


一、转换罗马数字

        1.需求

                要求1:长度为小于等于9;要求2:只能是数字 //将内容变成罗马数字

                下面是阿拉伯数字跟罗马数字的对比关系:Ⅰ-1、Ⅱ-2、Ⅲ-3、Ⅳ-4、Ⅴ-5、Ⅵ-6、Ⅶ-7、Ⅷ-8、Ⅸ-9

                注意点:罗马数字里面是没有0的,如果键盘录入的数字包含0,可以变成" "(长度为0的字符串)

        2.参考答案

    //转换罗马数字
    //要求1:长度为小于等于9
    //要求2:只能是数字
    //将内容变成罗马数字
    //下面是阿拉伯数字跟罗马数字的对比关系:
    //Ⅰ-1、Ⅱ-2、Ⅲ-3、Ⅳ-4、Ⅴ-5、Ⅵ-6、Ⅶ-7、Ⅷ-8、Ⅸ-9
    //注意点:
    //罗马数字里面是没有0的
    //如果键盘录入的数字包含0,可以变成" "(长度为0的字符串)
    public static void main(String[] args) {
        //键盘录入阿拉伯数字
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入您要转换的阿拉伯数字:");
            String number = sc.next();

            //调用方法judge,判断输入是否合规,确定是否转换
            if (judge(number)) {
                //调用方法convertNum,打印结果
                System.out.println(convertNum(number));
                break;
            }
        }
    }

    //定义方法judge,判断输入是否合规
    public static boolean judge(String number) {
        //定义变量judgement,记录判断结果
        boolean judgement = true;
        if (number.length() > 9) {
            System.out.println("输入数字过大,无法转换!!!");
            judgement = false;
        }
        for (int i = 0; i < number.length(); i++) {
            char c = number.charAt(i);
            if (c < '0' || c > '9') {
                System.out.println("违规输入,请重新输入!!!");
                judgement = false;
                break;
            }
        }
        return judgement;
    }

    //定义方法convertNum,将阿拉伯数字转换为罗马数字
    public static String convertNum(String number) {
        //定义数组RomeNumArr,存储罗马数字
        String[] RomeNumArr = {"", "Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ", "Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ"};

        //创建StringJoiner对象result,存储转换完成的罗马数字
        StringJoiner result = new StringJoiner(" ");

        //遍历阿拉伯数字字符串,获得每一位,并将其转换为整数,并转换为罗马数字
        for (int i = 0; i < number.length(); i++) {
            //定义变量index,记录转换后的每一位整数类型的阿拉伯数字
            int index = number.charAt(i) - 48;
            result.add(RomeNumArr[index]);
        }
        return result.toString();
    }

 二、字符串匹配

        1.需求

                给定两个字符串,A和B。A的旋转操作就是将A最左边的字符移动到最右边。例如,若A='abcde',在移动一次之后结果就是'bcdea'。如果在若干次调整操作之后,A能变成B,那么返回true;如果不能匹配成功,则返回false。

        2.参考答案

    //给定两个字符串,A和B
    //A的旋转操作就是将A最左边的字符移动到最右边
    //例如,若A='abcde',在移动一次之后结果就是'bcdea'
    //如果在若干次调整操作之后,A能变成B,那么返回true
    //如果不能匹配成功,则返回false
    public static void main(String[] args) {
        //键盘录入两个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要旋转的字符串:");
        String strA = sc.next();
        System.out.println("请输入要匹配的字符串:");
        String strB = sc.next();

        //调用方法rotataMat,得到旋转后的字符串,对字符串进行匹配
        if (rotataMat(strA, strB)) {
            System.out.println("匹配成功");
        } else {
            System.out.println("匹配失败");
        }
    }

    //定义方法rotata,将第一个字符串进行旋转,并进行匹配
    //形参string1代表要旋转的字符串,string2代表要匹配的字符串
    public static boolean rotataMat(String string1, String string2) {
        for (int i = 0; i < string1.length(); i++) {
            if (string1.equals(string2)) {
                return true;
            } else {
                //获取字符串最左边的字符
                char left = string1.charAt(0);

                //创建StringBuilder对象tempStr,记录将A最左边的字符移动到最右边后的字符串
                StringBuilder tempStr = new StringBuilder();
                for (int j = 1; j < string1.length(); j++) {
                    tempStr.append(string1.charAt(j));
                }
                string1 = tempStr.append(left).toString();
            }
        }
        return false;
    }

三、打乱字符串

        1.需求

                键盘输入任意字符串,打乱里面的内容

        2.解题方案

                1、字符串是不可变的

                2、如果要变化需要变成字符数组

                3、调整完毕之后再变回字符串

        3.参考答案

    //键盘输入任意字符串,打乱里面的内容
    public static void main(String[] args) {
        //键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要打乱的字符串:");
        String str = sc.next();

        //调用方法disruption,打印打乱后的字符串
        System.out.print("打乱后的字符串为:");
        System.out.println(disruption(str));
    }

    //定义方法disruption,打乱字符串的内容
    public static String disruption(String string) {
        //将字符串转换为数组
        char[] array = string.toCharArray();

        //循环打乱字符串
        Random r = new Random();
        for (int i = 0; i < array.length; i++) {
            //生成随机数,随机获取索引,索引不能重复
            int index = r.nextInt(array.length - 1);

            //定义变量temp,临时存储获取的数据值
            char temp = array[i];
            array[i] = array[index];
            array[index] = temp;
        }
        //定义变量result,记录打乱后的字符串
        String result = new String(array);
        return result;
    }

四、验证码生成

        1.需求

                内容:可以是小写字母,也可以是大写字母,还可以是数字

                规则:

长度为5

内容中是四位字母,1位数字。

其中数字只有1位,但是可以出现在任意的位置。

        2.参考答案

    //生成验证码
    //内容:可以是小写字母,也可以是大写字母,还可以是数字
    //规则:
    //长度为5
    //内容中是四位字母,1位数字。
    //其中数字只有1位,但是可以出现在任意的位置。
    public static void main(String[] args) {
        //定义长度为62的字符数组letter,存储小写字母、大写字母
        char[] letter = new char[52];
        //存入大小写字母
        for (int i = 0; i < letter.length; i++) {
            if (i <= 25) {
                letter[i] = (char) (65 + i);
            } else {
                letter[i] = (char) (97 + i - 26);
            }
        }

        //定义长度为5的数组,存储验证码
        char[] verify = new char[5];
        //生成随机索引,填充数组
        Random r = new Random();
        for (int i = 0; i < verify.length; i++) {
            int index = r.nextInt(letter.length - 1);
            if (i == verify.length - 1) {
                verify[i] = (char) (r.nextInt(10) + 48);
            } else {
                verify[i] = letter[index];
            }
        }

        //打乱验证码
        for (int i = 0; i < verify.length; i++) {
            int index = r.nextInt(verify.length - 1);
            char temp = verify[i];
            verify[i] = verify[index];
            verify[index] = temp;
        }

        //将验证码拼接为字符串
        String verifyCode = new String(verify);
        //打印验证码
        System.out.println("验证码为:" + verifyCode);
    }

五、字符统计

        1.需求

                请编写程序,由键盘录入一个字符串,统计字符串中英文字母和数字分别有多少个。比如:Hello12345World中字母:10个,数字:5个。

        2.解题方案 

                1、键盘录入一个字符串,用 Scanner 实现

                2、要统计两种类型的字符个数,需定义两个统计变量,初始值都为0

                3、遍历字符串,得到每一个字符

                4、判断该字符属于哪种类型,然后对应类型的统计变量+1,判断字母时需要考虑大小写,条件比较复杂,怎样做才能使判断更简单呢?

        3.解题步骤

                1、创建键盘录入Scanner对象,使用nextLine方法接收输入的字符串。

                2、为方便后续判断,使用String的toLowerCase方法,将字符串中的字符都转为小写。

                3、需定义两个统计变量,初始值都为0

                4、遍历字符串,得到每一个字符

                5、判断该字符属于哪种类型,然后对应类型的统计变量+1,次数判断英文字母时只需判断小写即可。

        4.参考答案

    //请编写程序,由键盘录入一个字符串,统计字符串中英文字母和数字分别有多少个。
    //比如:Hello12345World中字母:10个,数字:5个。
    public static void main(String[] args) {
        //键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        //对输入的字符串进行合法性判断,并统计字符串中英文字母和数字分别有多少个。
        //定义变量letterCount,记录字符串中英文字母的个数;numCount记录字符串中数字的个数
        int letterCount = 0;
        int numCount = 0;
        while (true) {
            System.out.print("请输入一个字符串:");
            String string = sc.next();
            //定义变量flag,记录判断结果,默认为合法
            boolean flag = true;
            for (int i = 0; i < string.length(); i++) {
                if (string.charAt(i) >= 48 && string.charAt(i) <= 57) {
                    numCount++;
                } else if (string.charAt(i) >= 65 && string.charAt(i) <= 90) {
                    letterCount++;
                } else if (string.charAt(i) >= 97 && string.charAt(i) <= 122) {
                    letterCount++;
                } else {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                break;
            } else {
                System.out.println("违规输入,请重新输入!!!");
            }
        }
        System.out.println("字符串中英文字母的个数为:" + letterCount);
        System.out.println("字符串中数字的个数:" + numCount);
    }

六、字符串对称

        1.需求

                请定义一个方法用于判断一个字符串是否是对称的字符串,并在主方法中测试方法。例如:"abcba"、"上海自来水来自海上"均为对称字符串。

        2.解题方案

                1、判断是否对称,方法的返回值是什么类型?参数列表是什么?

                2、怎样判断对称呢?如果可以将字符串反转,反转后发现跟原来的字符串完全一样,不就可以判断出来了吗,那么哪个类有字符串的反转功能呢?

        3.解题步骤

                1、定义方法,返回值类型为boolean,参数列表为String类型的一个参数。

                2、将字符串转换为StringBuilder类型,调用StringBuilder的reverse()方法将字符串反转。

                3、将反转后的字符串再转回String类型,并与原字符串比较,如果相等,返回true,否则返回false

                4、在主方法中,定义一个字符串,调用方法测试结果。

        4.参考答案

    //请定义一个方法用于判断一个字符串是否是对称的字符串,并在主方法中测试方法。
    //例如:"abcba"、"上海自来水来自海上"均为对称字符串。
    public static void main(String[] args) {
        //键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个字符串:");
        String string = sc.next();

        //调用方法judge,打印判断结果
        System.out.print("字符串是否为对称的字符串:");
        System.out.println(judge(string));
    }

    //定义方法judge,判断一个字符串是否是对称的字符串
    public static boolean judge(String string) {
        //将字符串反转
        StringBuilder inversion = new StringBuilder(string);
        String result = inversion.reverse().toString();
        //判断是否相同
        if (result.equals(string)) {
            return true;
        } else {
            return false;
        }
    }

七、身份证号码合法判断

        1.需求

                我国的居民身份证号码,由由十七位数字本体码和一位数字校验码组成。请定义方法判断用户输入的身份证号码是否合法,并在主方法中调用方法测试结果。规则为:号码为18位,不能以数字0开头,前17位只可以是数字,最后一位可以是数字或者大写字母X。

        2.解题方案

                1、要判断字符串是否符合规则,方法的返回值类型是什么?参数列表是什么?

                2、使用String的API,对每种不符合条件的情况作出判断,一旦发现不符合条件就可以结束方法的执行,返回结果了。

                3、在主方法中创建键盘录入,调用方法,输入各种数据测试结果。

        3.解题步骤

                1、定义方法,返回值类型为boolean表示是否合法,参数列表为String类型的id,表示要判断的数据。

                2、对每种不符合条件的情况作出判断

                        ​ 2.1、如果字符串长度不是18,返回false。

                        ​ 2.2、如果字符串以数字"0"开头,返回false。

                        ​ 2.3、遍历字符串,获取每一位字符,判断前17位,如果不是数字,返回false,判断最后一位如果不是数字或者X,返回false

                        ​ 2.4、所以的不符合条件都筛选完成,返回true

                3、在主方法中创建键盘录入Scanner对象,调用nextLine()方法,获取用户输入,调用方法,传递参数,查看结果。要多运行几次,判断各种不符合条件的数据。

        4.参考答案

    //我国的居民身份证号码,由十七位数字本体码和一位数字校验码组成。
    //请定义方法判断用户输入的身份证号码是否合法,并在主方法中调用方法测试结果。
    //规则为:号码为18位,不能以数字0开头,前17位只可以是数字,最后一位可以是数字或者大写字母X。
    public static void main(String[] args) {
        //键盘录入身份证号码
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入您的身份证号码:");
        String id = sc.next();

        //调用方法,打印结果
        System.out.println("身份证号码是否合法:" + judge(id));
    }

    //定义方法judge,判断用户输入的身份证号码是否合法
    public static boolean judge(String string) {
        //定义变量flag,记录判断结果,默认为输入正确
        boolean flag = true;
        //判断输入的身份证号码长度是否合法
        if (string.length() != 18) {
            return false;
        } else {
            //判断第一位是否合法
            if (string.charAt(0) > 48 && string.charAt(0) <= 57) {
                for (int i = 1; i < string.length()-1; i++) {
                    //判断2~17位是否合法
                    if (string.charAt(i) >= 48 && string.charAt(i) <= 57) {
                        //判断最后一位是否合法
                        if (string.charAt(string.length() - 1) == 88 ||
                                (string.charAt(string.length() - 1) >= 48 && string.charAt(string.length() - 1) <= 57)) {
                        } else {
                            return false;
                        }
                    } else {
                        return false;
                    }
                }
            } else {
                return false;
            }
            return true;
        }
    }

八、字符串拼接

        1.需求

                定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。

                要求:

                        ​ 1、如果传递的参数为空,返回null

                        ​ 2、如果传递的数组元素个数为0,返回[]

                        ​ 3、如果数组为int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]

        2.解题方案

                1、定义方法的返回值是什么?参数列表是什么?

                2、如果不做判断就对数组进行遍历,那么如果数组对象为空,会报出异常,怎样避免空指针异常呢?

                3、拼接字符串必然涉及到频繁改变,该采用可变的字符序列StringBuilder比较好

                4、遍历数组,按照题目格式拼接数组中的元素。

                5、将字符串返回

                6、在主方法中定义数组,并调用方法,打印结果

        3.解题步骤

                1、定义方法返回值类型:String,参数:int[] arr

                2、判断对象如果为null,直接返回null

                3、创建StringBuilder对象

                4、遍历数组,按照要求进行拼接数组元素,如果是不是最后一个元素,还要拼接逗号和空格

                5、将StringBuilder转为String返回

                6、在主方法中定义数组,并调用方法,打印结果

        4.参考答案

    //定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。
    //要求:
    //1、如果传递的参数为空,返回null
    //2、如果传递的数组元素个数为0,返回[]
    //3、如果数组为int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]
    public static void main(String[] args) {
        //定义整数类型的数组number
        int[] number = {1,2,3};

        //调用方法splicing,在控制台输出结果
        System.out.println(splicing(number));
    }

    //定义方法,将数组中的数据拼接为字符串返回
    public static String splicing(int[] number) {
        //创建StringJoiner对象result,存储拼接后的字符串
        StringBuilder result = new StringBuilder("[");
        //判断传递的参数是否为空
        if (number == null) {
            return null;
        } else {
            //遍历数组,拼接元素
            for (int i = 0; i < number.length; i++) {
                if (i != number.length - 1) {
                    result.append((char) ((number[i]) + 48)).append(", ");
                } else {
                    result.append((char) ((number[i]) + 48));
                }
            }
        }
        return result.append("]").toString();
    }
    public static void main(String[] args) {
        // 定义一个 int 类型的数组,用静态初始化完成数组元素的初始化
        int[] arr = {1, 2, 3};
        // 调用方法,输出结果
        System.out.println(arrayToString(arr));
    }


    public static String arrayToString(int[] arr) {
        // 健壮性判断
        if (arr == null) {
            return null;
        }
        //在方法中用 StringJoiner 按照要求进行拼接,并把结果转成 String 返回
        StringJoiner sj = new StringJoiner(", ","[","]");
        for (int i = 0; i < arr.length; i++) {
            sj.add(arr[i] + "");
        }
        return sj.toString();
    }

 九、统计某字符串在文本中出现的次数

        1.需求

                在String类的API中,有如下两个方法:

// 查找参数字符串str在调用方法的字符串中第一次出现的索引,如果不存在,返回-1
public int indexOf(String str)

// 截取字符串,从索引beginIndex(包含)开始到字符串的结尾
public String substring(int beginIndex)

                请仔细阅读API中这两个方法的解释,完成如下需求。

                现有如下文本:"Java语言是面向对象的,Java语言是健壮的,Java语言是安全的,Java是高性能的,Java语言是跨平台的"。请编写程序,统计该文本中"Java"一词出现的次数。

        2.解题方案

                1、要找的子串是否存在,如果存在获取其出现的位置。这个可以使用indexOf完成。                 2、如果找到了,那么就记录出现的位置并在剩余的字符串中继续查找该子串,而剩余字符串的起始位是出现位置再加上子串的长度。 

                3、以此类推,通过循环完成查找,如果找不到就是-1,每次找到用计数器记录次数。

        3.解题步骤

                1、定义方法,返回值int表示次数,参数列表两个字符串,第一个表示在哪个字符串中查找,第二个表示要查找的目标子串

                2、定义统计变量表示次数。

                3、定义索引变量,表示每次找到子串出现的索引。

                4、定义循环,判断条件为在字符串中找到了目标子串,使用indexOf实现。

                5、如果找到的索引不是-1,在循环中,统计变量累加。

                6、把查找过的部分剪切掉,从找到的索引+子串长度的位置开始截取,使用substring实现。

                7、将统计变量返回

                8、在主方法中,定义字符串表示题目中的文本,定义字符串表示要查找的子串,调用方法,获取结果。

        4.参考答案

    public static void main(String[] args) {
        String str = "Java语言是面向对象的,Java语言是健壮的,Java语言是安全的,Java是高性能的,Java语言是跨平台的";
        String tar = "Java";
        // 调用方法并输出
        System.out.println(search(str, tar));

    }
    // 返回值int表示次数,参数列表str表示在哪个字符串中查找,tar表示要查找的目标子串
    public static int search(String str, String tar) {
        // 定义统计变量表示次数
        int count = 0;
        // 定义索引变量,表示每次找到子串出现的索引
        int index = -1;
        // 定义循环,判断条件为在字符串中找到了目标子串
        while ((index = str.indexOf(tar)) != -1) { // 将找到的索引赋值给变量并判断
            // 次数累加
            count++;
            // 把查找过的部分剪切掉,从找到的索引+子串长度的位置开始截取。
            str = str.substring(index + tar.length());
        }
        return count;
    }
    public static void main(String[] args) {
        String str = "Java语言是面向对象的,Java语言是健壮的,Java语言是安全的,Java是高性能的,Java语言是跨平台的";
        String tar = "Java";
        // 调用方法并输出
        System.out.println(search(str, tar));

    }

    // 替换之后求长度差
    public static int search(String str, String tar) {
        String newStr = str.replace(tar, "");
        int count = (str.length() - newStr.length()) / tar.length();
        return count;

    }

总结

在了解了字符串的基础知识后,一定要自己独立动手练习代码,为以后的进阶打好基础。

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值