String字符串练习

练习1:用户登录

1、需求:已知正确的用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示。

2、分析:(1)已知正确的用户名和密码,所以肯定有变量来存储这两个信息;

(2)也得有两个变量用来接收用户输入的用户名和密码,这里用键盘录入实现;

(3)给出3次机会进行比较,可通过循环进行实现,当完全相同时则可通过break跳出循环。

import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
        //1、已知正确的用户名和密码,所以肯定有变量来存储这两个信息
        String username = "2972717586";
        String password = "liu200328";
        //2、也得有两个变量用来接收用户输入的用户名和密码,这里用键盘录入实现
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String input1 = sc.next();
        System.out.println("请输入密码:");
        String input2 = sc.next();
        //3、给出3次机会进行比较,可通过循环进行实现,当完全相同时则可通过break跳出循环。
        for (int i = 0; i < 3; i++) {
            if(input1.equals(username) && (input2.equals(password))){
                System.out.println("登录成功!");
                break;
            }
        }
    }
}

3、改进:代码功能上有问题,就是并没有实现“总共给3次机会”,只给出了3次判断机会,并没有给出3次输入机会,所以键盘录入也要用for循环括起来,修改后的代码如下:

import java.util.Scanner;

public class StringDemo1 {
    public static void main(String[] args) {
        //1、已知正确的用户名和密码,所以肯定有变量来存储这两个信息
        String username = "2972717586";
        String password = "liu200328";
        //2、实现3次登录机会,包括用户键盘录入和正确的用户名和密码进行判断
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            //也得有两个变量用来接收用户输入的用户名和密码,这里用键盘录入实现
            System.out.println("请输入用户名:");
            String input1 = sc.next();
            System.out.println("请输入密码:");
            String input2 = sc.next();
            //进行比较,可通过循环进行实现,当完全相同时则可通过break跳出循环。
            if (input1.equals(username) && (input2.equals(password))) {
                System.out.println("登录成功!");
                break;
            } else{ 
            System.out.println("登陆失败,用户名或密码有误!"); //不同时则给出提示
            }
        }
    }
}

掌握:(1)equals方法用来判断两个字符串是否相等。

(2)当满足某条件时跳出循环,否则循环继续执行。

 ①是否知道循环的次数:不知道用while(true);知道则用for。

练习2:遍历字符串

1、需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串。

Tips:

(1)字符串也有索引,使用方法charAt(index) 获取指定索引处的字符;

(2)字符串的长度用方法length()获取。

2、分析:(1)键盘录入一个字符串,使用变量s进行接收;

(2)使用for循环遍历字符串的每一个下标index,然后再调用charAt(index)获得索引所对应的每一个字符。

代码如下:

import java.util.Scanner;

public class StringDemo2 {
    public static void main(String[] args) {
        //1、键盘录入一个字符串,使用变量s进行接收;
        System.out.println("请输入字符串:");
        Scanner sc = new Scanner(System.in);
        String s  = sc.next();
        //2、使用for循环遍历字符串的每一个下标index,然后再调用charAt(index)获得索引所对应的每一个字符。
        for (int i = 0; i < s.length(); i++) {
            System.out.println(s.charAt(i));
        }
    }
}

练习3:统计字符次数

1、需求:键盘录入一个字符串,统计该字符串中大写字母,小写字母和数字出现的次数。

2、分析:(1)键盘录入一个字符串,使用变量s进行接收;

(2)遍历得到每一个字符,再转换为int型的整数,然后与ASCII码表中大小写字母以及数字0-9的范围进行比较,当满足条件时++。

import java.util.Scanner;

public class StringDemo3 {
    public static void main(String[] args) {
        //1、键盘录入一个字符串,使用变量s进行接收;
        System.out.println("请输入字符串:");
        Scanner sc = new Scanner(System.in);
        String s  = sc.next();
        //2、统计该字符串中大写字母,小写字母和数字出现的次数
        int count1 = 0, count2 = 0, count3 = 0;
        for (int i = 0; i < s.length(); i++) {
            //首先取得字符串中的每一个字符,然后强转为int与ASCII码表比对
            int num = (int)s.charAt(i);
            if((num >= 48) && (num <= 57)){
                count1++;
            } else if ((num >= 65) && (num <= 90)) {
                count2++;
            } else if ((num >= 97) && (num <= 122)) {
                count3++;
            }
        }
        System.out.println("数字字符出现的次数为" + count1);
        System.out.println("大写字符出现的次数为" + count2);
        System.out.println("小写字符出现的次数为" + count3);
    }
}

对于步骤2可以进行修改,即我不必知道ASCII码表中大小写字母以及数字0-9的范围就能进行比较,因为char类型的变量在参与运算时自动向上提升为int型的整数,即ASCII表中对应的整数,所以可以直接将获得的字符与字符'a'和'z'比较:即(c >= 'a') && (c <= 'z')这种格式。

下面是比较部分修改后的代码:

        int count1 = 0, count2 = 0, count3 = 0;
        for (int i = 0; i < s.length(); i++) {
            //首先取得字符串中的每一个字符,然后利用运算符进行比较
            char c = s.charAt(i);
            if((c >= '0') && (c <= '9')){
                count1++;
            } else if ((c >= 'A') && (c <= 'Z')) {
                count2++;
            } else if ((c >= 'a') && (c <= 'z')) {
                count3++;
            }
        }

练习4:拼接字符串

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

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

2、分析:获取数组中的每一个数,然后使用+和字符串进行拼接。

public class StringDemo5 {
    public static void main(String[] args) {
        //首先有这样一个数组
        int[] arr = {1, 2, 3};
        String s = "[";
        for (int i = 0; i < arr.length; i++) {
            if(i == arr.length - 1){
                s = s + arr[i] + "]";
            } else {
                s = s + arr[i] + ",";
            }
        }
        System.out.println(s);
    }
}

3、改进:要求定义一个方法,但我是直接写的,在下面的代码中改成一个方法。

public class StringDemo5 {
    public static void main(String[] args) {
        //首先有这样一个数组
        int[] arr = {1, 2, 3};
        String s = arrtoString(arr);
        System.out.println(s);
    }
    //定义一个方法:把int数组中的数据按照指定的格式拼接成一个字符串返回
    public static String arrtoString(int[] arr){
        //数组为null,未指向内存中的任何数据
        if(arr == null){
            return "";
        }
        //数组长度为0
        if(arr.length == 0){
            return "[]";
        }
        //当执行到这一步时证明传入的数组既不为null,数组长度也不为0
        String s = "[";
        for (int i = 0; i < arr.length; i++) {
            if(i == arr.length - 1){
                s = s + arr[i] + "]";
            } else {
                s = s + arr[i] + ",";
            }
        }
        return s;
    }
}

数组为null和数组长度为0?

 练习5:字符串反转

1、需求:定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果例如,键盘录入 abc,输出结果 cba。

2、分析:从后往前获取每一个字符,然后使用+进行拼接。

import java.util.Scanner;

public class StringDemo4 {
    public static void main(String[] args) {
        //1、键盘录入一个字符串,使用变量s进行接收;
        System.out.println("请输入字符串:");
        Scanner sc = new Scanner(System.in);
        String s1  = sc.next();
        //2、从后往前遍历字符串,依次添加到一个新字符串中
        String s2 = "";
        for (int i = s1.length()-1 ; i >= 0; i--) {
            s2 = s2 + s1.charAt(i);
        }
        System.out.println(s2);
    }
}

3、改进:要求定义一个方法,但我是直接写的,在下面的代码中改成一个方法。 

import java.util.Scanner;

public class StringDemo4 {
    public static void main(String[] args) {
        //1、键盘录入一个字符串,使用变量s进行接收;
        System.out.println("请输入字符串:");
        Scanner sc = new Scanner(System.in);
        String s1  = sc.next();

        System.out.println(reverse(s1));
    }
    public static String reverse(String s1){
        //2、从后往前遍历字符串,依次添加到一个新字符串中
        String s2 = "";
        for (int i = s1.length()-1 ; i >= 0; i--) {
            s2 = s2 + s1.charAt(i);
        }
        return s2;
    }
}

练习6:金额转换

 分析:1、创建一个长度为7的数组;

2、依次获取数字个位、十位、百位的值,从数组的后面往前存,没存的位置数组默认初始化为0,正好符合题意;

3、依次取出数组中的每个数,用两个switch选择金额和后面的单位。

import java.util.Scanner;

public class StringDemo6 {
    public static void main(String[] args) {
        //1、键盘录入一个整数;
        System.out.println("请输入金额:");
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        //用数组来存储每一位数
        int[] arr = new int[7];
        int i = arr.length - 1;
        while (num != 0) {
            int x = num % 10;
            arr[i] = x;
            i--;
            num = num / 10;
        }
        //遍历每一位数,用switch进行判断选择,在用+进行拼接
        String s ="";
        for (int j = 0; j < arr.length; j++) {
            switch (arr[j]) {
                case 0 -> s = s + "零";
                case 1 -> s = s + "壹";
                case 2 -> s = s + "贰";
                case 3 -> s = s + "叁";
                case 4 -> s = s + "肆";
                case 5 -> s = s + "伍";
                case 6 -> s = s + "陆";
                case 7 -> s = s + "柒";
                case 8 -> s = s + "捌";
                case 9 -> s = s + "玖";
                default -> System.out.println("不存在!");
            }
            switch (j) {
                case 0 -> s = s + "佰";
                case 1 -> s = s + "拾";
                case 2 -> s = s + "万";
                case 3 -> s = s + "仟";
                case 4 -> s = s + "佰";
                case 5 -> s = s + "拾";
                case 6 -> s = s + "元";
                default -> System.out.println("不存在!");
            }

        }
        System.out.println("转换后的金额为:");
        System.out.println(s);
    }
}

字符串拼接有一个注意事项:即拼接谁在前谁在后。

视频里的核心思想:

1、建一个表存大写的0-9,并且索引与其中的数一一对应;

2、根据求得的数取出相应的大写汉字进行拼接;

3、再将单位插入。

import java.util.Scanner;

public class StringDemo6 {
    public static void main(String[] args) {
        //1、键盘录入一个金额
        Scanner sc = new Scanner(System.in);
        int money;
        //对输入的金额进行判断,不合法则重新输入
        while (true) {
            System.out.println("请输入金额:");
            money = sc.nextInt();
            if ((money > 0) && (money < 9999999)) {
                break;
            }
            else {
                System.out.println("不合法!请重新输入");
            }
        }
        //建一个表存大写的0-9,并且索引与其中的数一一对应
        String s1 = "零壹贰叁肆伍陆柒捌玖";
        String s2 = "佰拾万仟佰拾元";
        String s3 = "";
        while (money != 0) {
            //直接把x看作s1字符串的下标
            int x = money % 10;
            s3 = s1.charAt(x) + s3;
            money = money / 10;
        }
        int count = 7 - s3.length();
        for (int i = 0; i < count; i++) {
            s3 = "零" + s3;
        }
        String moneyStr = "";
        for (int i = 0; i < s3.length(); i++) {
            moneyStr = moneyStr + s3.charAt(i) + s2.charAt(i);
        }
        System.out.println(moneyStr);
    }
}

练习7:手机号屏蔽

①subString(int beginIndex,int endIndex):返回取的一截字符串,包头不包尾。

public class StringDemo7 {
    public static void main(String[] args) {
        String phoneNumber = "15236302279";
        String s1 = phoneNumber.substring(0,3);
        String s2 = phoneNumber.substring(7);
        System.out.println(s1 + "****" + s2);
    }
}

练习8:身份证信息查看

public class StringDemo8 {
    public static void main(String[] args) {
        String ID = "412821195206055432";
        String s1 = ID.substring(6,10);
        String s2 = ID.substring(10,12);
        String s3 = ID.substring(12,14);
        char c = ID.charAt(16);
        //如何将字符'0'-'9'转换为数字0-9?
        int num = c - 48;
        System.out.println("人物信息为:");
        System.out.println("出生日期:" + s1 + "年" + s2 + "月" + s3 + "日");
        if((num % 2) == 0){
            System.out.println("性别为:女");
        }
        else {
            System.out.println("性别为:男");
        }
    }
}

1、如何将字符'0'-'9'转换为数字0-9?即c - 48;

char类型的c变量在参与运算时会自动提升为ASCII码中的int型整数。

练习9:敏感词屏蔽

需求:将一些敏感词替换为***。

①replace(target,replacement):返回target被替换为replacement的源字符串。

public class StringDemo9 {
    public static void main(String[] args) {
        String talk = "你好,TMD";
        String[] words = {"TMD", "CNM", "MLGB"};
        for (int i = 0; i < words.length; i++) {
            talk = talk.replace(words[i],"***" );
        }
        System.out.println(talk);
    }
}

练习10:转换罗马数字

键盘录入一个字符串,要求1:长度为小于等于9;要求2:只能是数字。将内容变成罗马数字。
下面是阿拉伯数字跟罗马数字的对比关系:
1-1、1-2、1-3、IV-4、V-5、V-6、-7、V-8、1X-9
注意点:
罗马数字里面是没有0的;
如果键盘录入的数字包含0,可以变成""(长度为0的字符串)。

分析:1、键盘录入一个字符串:对于要求1,使用s.length() <= 9进行判断,要求2写成一个方法。

2、将内容变成罗马数字:使用charAt方法获取每一个字符,然后根据对照选择switch选择罗马数字和单位进行添加。

import java.util.Scanner;

public class test01 {
    public static void main(String[] args) {
        //键盘录入一个字符串
        String s = "";
        while (true) {
            Scanner sc = new Scanner(System.in);
            s = sc.next();
            if (s.length() <= 9) {
                if (isNumber(s)) {
                    break;
                } else {
                    System.out.println("请不要输入除数字以外的字符!");
                }
            } else {
                System.out.println("字符串的长度不能大于9!");
            }
        }
        //将内容变成罗马数字
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            switch (c){
                case '0' -> sb.append("");
                case '1' -> sb.append("Ⅰ");
                case '2' -> sb.append("Ⅱ");
                case '3' -> sb.append("Ⅲ");
                case '4' -> sb.append("Ⅳ");
                case '5' -> sb.append("Ⅴ");
                case '6' -> sb.append("Ⅵ");
                case '7' -> sb.append("Ⅶ");
                case '8' -> sb.append("Ⅷ");
                case '9' -> sb.append("Ⅸ");
                default -> System.out.println("没有此数字!");
            }
        }
        System.out.println(sb);
        
    }
    //判断输入的字符串是否为数字
    public static boolean isNumber(String s){
        boolean flag = false;
        for (int i = 0; i < s.length(); i++) {
            if(48 <= s.charAt(i) && s.charAt(i) <= 57){
                flag = true;
            }
        }
        return flag;
    }
}

改进(1)对输入的字符串的判断:也可以把两个要求写到一个方法中去,这时候就要反着来了,当不合适的时候需return false,当两个return false都没有执行的时候就说明满足要求1和2,则可return true;和练习4中的(3)改进思路一样。

    //判断输入的字符串是否为数字
    public static boolean isNumber(String s){
        if(s.length() > 9) {
            return false;
        }
        for (int i = 0; i < s.length(); i++) {
            if('0' > s.charAt(i) && s.charAt(i) > '9'){
                return false;
            }
        }
        return true;
    }

(2)然后就是查表法,将转换后的以数组的形式存储:

    //将整数转换为罗马数字
    public static String  toRomanNumerals(int num){
        String[] s = {"", "Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ", "Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ"};
        return s[num];
    }
        //将内容变成罗马数字
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            int num = s.charAt(i) - '0';
            sb.append(toRomanNumerals(num));
        }

练习11:调整字符串

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

public class test02 {
    public static void main(String[] args) {
        //给定两个字符串A和B
        String A = "abcde";
        String B = "eabcd";
        boolean flag = false;
        while(true){
            String rotateA = rotate(A);
            if(rotateA.equals(B)){
                flag = true;
                break;
            }
        }
        System.out.println(flag);

    }
    public static String rotate(String s){
        StringBuilder sb = new StringBuilder();
        sb.append(s.substring(1));
        sb.append(s.charAt(0));
        return sb.toString();
    }
}

我上面这个代码有两个问题:

①如果经过若干次旋转之后A永远无法变成B,那么循环就无法停止:其实当旋转次数=字符串A的长度时就已经变回A最初的样子了,所以循环的次数是字符串A的长度。

②String rotateA = rotate(A);,永远将A旋转一次的结果赋给rotateA,一直在重复这个过程,所以要将旋转之后的值要重新赋给A。

修改之后的结果如下:

public class test02 {
    public static void main(String[] args) {
        //给定两个字符串A和B
        String A = "abcde";
        String B = "eabcd";
        boolean flag = false;
        for (int i = 0; i < A.length(); i++) {
            A = rotate(A);
            if(A.equals(B)){
                flag = true;
                break;
            }
        }
        System.out.println(flag);

    }
    public static String rotate(String s){
        StringBuilder sb = new StringBuilder();
        sb.append(s.substring(1));
        sb.append(s.charAt(0));
        System.out.println(sb);
        return sb.toString();

    }
}

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

跟之前的一个打乱数组中的数有点像,所以此题也可以先将字符串转换为数组。

1、打乱数组的思路:从头依次获取数组中的每一个元素,然后随机选取数组中的一个数,两者进行交换。

2、利用字符数组创建字符串:s = new String(chs);。

要修改字符串的内容的话,就把字符串转为字符数组,然后再通过字符数组创建新的字符串。 

import java.util.Random;
import java.util.Scanner;

public class test03 {
    public static void main(String[] args) {
        //键盘录入一个字符串
        String s = "";
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        s = sc.next();

        Random r = new Random();
        int index = r.nextInt(s.length());
        char[] chs = s.toCharArray();
        for (int i = 0; i < chs.length; i++) {
            char temp = chs[i];
            chs[i] = chs[index];
            chs[index] = temp;
        }
        s = new String(chs);
        System.out.println(s);
    }
}

练习13: 生成验证码

内容:可以是小写字母,也可以是大写字母,还可以是数字规则:
长度为5
内容中是四位字母,1位数字。
其中数字只有1位,但是可以出现在任意的位置。

import java.util.Random;

public class test04 {
    public static void main(String[] args) {
        //首先把52个大小写英文字母存到数组中
        String[] s = {"A","B","C","D","E","F","G",
                "H","I","J","K","L","M","N",
                "O","P","Q","R","S","T",
                "U","V","W","X","Y","Z",
                "a","b","c","d","e","f","g",
                "h","i","j","k","l","m","n",
                "o","p","q","r","s","t",
                "u","v","w","x","y","z"};
        //创建一个sb对象用来存字符串
        StringBuilder sb = new StringBuilder();
        //随机选择数组中的字母,循环4次生成4个
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(s.length);
            sb.append(s[index]);
        }
        //生成数字
        int number = r.nextInt(10);
        //生成数字插入的位置
        int position = r.nextInt(5);
        sb.insert(position,number);
        System.out.println(sb.toString());
    }
}

关于验证码中的数字可以是任意位置,我用的是StringBuilder类里的insert方法。

练习14:求两个字符串数字的乘积

给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。注意:需要用已有的知识完成。

public class test05 {
    public static void main(String[] args) {
        String s1 = "1234";
        String s2 = "12345";
        StringBuilder sb = new StringBuilder();
        int num1 = toNumber(s1);
        int num2 = toNumber(s2);
        System.out.println(sb.append( num1 * num2).toString());
    }
    public static int toNumber(String s){
        int number = 0;
        for (int i = 0; i < s.length(); i++) {
            int x = s.charAt(i) - '0';
            number = number * 10 + x;
        }
        return number;
    }

}

练习15:给定一个英语句子,判断最后一个单词的位数

public class test06 {
    public static void main(String[] args) {
        String s = "Good luck to me";
        int count = 0;
        for (int i = s.length() - 1; i >= 0 ; i--) {
            if(s.charAt(i) != ' '){
                count++;
            } else {
                break;
            }
        }
        System.out.println(count);
    }
}
  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值