(day4) 自学Java——字符串

ctrl+alt+T 选择语句包裹

目录

1.API

2.String创建

3.字符串的比较

 4.字符串——练习

(1):用户登录

(2)遍历字符串和统计字符个数

(3)字符串拼接和反转

(4)金额转换

(5)手机号屏蔽,游戏敏感词替换

5.StringBuilder

6.字符串相关类的底层原理

7.较难练习

(1)罗马数字的两种写法

(2)调整字符串内容并比较

8.后续练习思路分析


1.API

API: 应用程序编程接口。

简单解释:就是别人写好的东西,我们不需要编写,直接使用即可。

Java API:指JDK中提供的各种功能的Java类。

API帮助文档,可以在这个文档里查询API。

2.String创建

字符串不可变,它们的值被创建后不能被更改。

chatAt();能够用来检索特定索引下的字符

substring();截取

replace();替换

equals();相等

toCharArray();字符串转字符数组

new String(arr);字符数组转字符串

 

当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在,不存在就创建新的,存在就复用。

直接复制好处:代码简单,节约内存。

new的方式创建字符串,字符串不会被复用。

3.字符串的比较

想要比较字符串的内容,必须用String里的方法。

 4.字符串——练习

(1):用户登录

  • 已知正确的用户名和密码,请用程序实现模拟用户登录。
  • 总共给3次机会,登录之后,给出相应提示。
import java.util.Scanner;

public class Login {
    public static void main(String[] args) {
        String rightUser="zhangsan";
        String rightPass="123456";
        Scanner sc=new Scanner(System.in);
        for (int i = 0; i <3 ; i++) {
            System.out.print("请输入账号:");
            String user=sc.next();
            System.out.print("请输入密码:");
            String pass=sc.next();
            if(rightUser.equals(user)&&rightPass.equals(pass)){
                System.out.println("登录成功");
                break;
            }
            else{
                System.out.println("登录失败,账号或密码有误。还有"+(2-i)+"次机会登录");
                if((2-i)==0){
                    System.out.println("您的"+user+"账号已经被锁定,请联系xxxx人员");
                }
            }
        }
    }
}

(2)遍历字符串和统计字符个数

  •  键盘录入一个字符串,使用程序在控制台遍历该字符串。
import java.util.Scanner;

public class StringTest {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入一个字符串:");
        String str=sc.next();
        for (int i = 0; i < str.length(); i++) {
            System.out.println(str.charAt(i));
        }
    }
}
  • 统计字符次数
  • 键盘录入一个字符串,统计该字符串中,大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
import java.util.Scanner;

public class StringTest {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入一个字符串:");
        String str=sc.next();
        int bigCount=0;
        int smallCount=0;
        int numCount=0;
//  char类型在计算时,会提升为int,然后查询ascii码表
        for (int i = 0; i < str.length(); i++) {
            char c=str.charAt(i);
            if(c>='A'&&c<='Z'){
                bigCount++;
            }
            else if(c>='a'&&c<='z'){
                smallCount++;
            }
            else if(c>='0'&&c<='9'){
                numCount++;
            }
        }
        System.out.println("大写字符个数:"+bigCount);
        System.out.println("小写字符个数:"+smallCount);
        System.out.println("数字字符个数:"+numCount);
    }
}

(3)字符串拼接和反转

  • 拼接字符串
  • 定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。
  • 例如:数组为int[]arr={1,2,3};   执行方法后的输出结果为:[1,2,3]
public class StringTest {
    public static void main(String[] args) {
        int[]arr={1,2,3};
        arrToString(arr);
    }
    public static  String arrToString(int[]arr){
        if(arr==null){
            return "";
        }
        if(arr.length==0){
            return "[]";
        }
//        数组不为null,长度不为0,说明数组中一定有数据
        String left="[";
        for (int i = 0; i < arr.length; i++) {
            if(i<arr.length-1){
                left=left+arr[i]+',';
            }
            else {
                left=left+arr[i];
            }
        }
        left=left+']';
        System.out.println(left);
        return left;
    }
}
  • 定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果。
  • 例如,键盘输入abc,输出结果cda。
import java.util.Scanner;

public class StringTest {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入一个字符串:");
        String c=sc.next();
        reverseArr(c);

    }
    public static void reverseArr(String str){
        String result="";
//倒着遍历
        for (int i = str.length()-1; i >=0 ; i--) {
            char c=str.charAt(i);
            result=result+c;
        }
        System.out.println(result);
    }
}

(4)金额转换

import java.util.Scanner;

public class StringTest {
    public static void main(String[] args) {
        //1.输入
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入金额:");
        int number = sc.nextInt();
        //判断金额是否有效
        if (number >= 1 && number <= 9999999) {
            String left = "";
            //4.获得数字的每一位,并转换、拼接
            while (true) {
                int ge = number % 10;
                number = number / 10;
                String geNew = ExchangeCapitalNum(ge);
                left = geNew + left;
                if (number == 0) {
                    break;
                }
            }
            //5.不足7位,在前面补0
            String leftStr = left;
            for (int i = 0; i < (7 - left.length()); i++) {
                leftStr = '零' + leftStr;
            }
            //6.满足7位数字,调用方法,补齐单位
            MoneyStr(leftStr);
        }
        else {
            System.out.println("输入金额无效");
        }
    }
    //2.转换,1-壹
    public static String ExchangeCapitalNum(int ge) {
        String[] arr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
        String geNew = arr[ge];
        return geNew;
    }
    //3.加单位
    public static void MoneyStr(String left) {
        String[] arr = {"佰", "拾", "万", "仟", "佰", "拾", "元"};
        String result = "";
        for (int i = arr.length - 1; i >= 0; i--) {

            char moneystr = left.charAt(i);
            result = moneystr + arr[i] + result;

        }
        System.out.println(result);
    }
}

(5)手机号屏蔽,游戏敏感词替换

  •  手机号屏蔽:将12387634991变成123****4991
public class StringTest {
    public static void main(String[] args) {
        //1.输入
        String phoneNum="12387634991";
        String result=phoneNum.substring(0,3)+"****"+phoneNum.substring(7,11);
        System.out.println(result);
    }
}
  • 游戏敏感词替换
public class StringTest {
    public static void main(String[] args) {
        //1.输入
        String talk="玩的很好,下次不要再玩了,TMD,SB";
        String[]arr={"TMD","SB","2B","CNM"};
        for (int i = 0; i < arr.length; i++) {
             talk=talk.replace(arr[i],"***");
        }
        System.out.println(talk);
    }
}

5.StringBuilder

 StringBuilder可以看成一个容器,创建之后里面的内容是可变的。

作用:提高字符串的操作效率。

使用场景:1.字符串的拼接;2.字符串的反转。

注:StringBuilder是Java已经写好的类,Java在底层对其做了特殊处理,打印对象不是地址值而是属性值。(用完可以转换为String,用方法:toString())

链式编程举例:

  • 练习:键盘接收一个字符串,程序判断该字符串是否是对称字符串,并在控制台打印是或者不是
  • 对称字符串:123321、111
  • 非对称字符串:123123
import java.util.Scanner;

public class StringTest {
    public static void main(String[] args) {
        //输入
        Scanner sc=new Scanner(System.in);
        System.out.println("判断该字符串是否为对称字符串");
        System.out.println("请输入一个字符串:");
        String str=sc.next();
        StringBuilder sb=new StringBuilder(str);
        String str1=sb.reverse().toString();
        if(str.equals(str1)){
            System.out.println("是");
        }
        else {
            System.out.println("不是");
        }
    }
}
  •  练习:拼接字符串。定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回。
  • 调用该方法,并在控制台输出结果。
  • 例如:数组为int[]arr={1,2,3};
  • 执行方法后输出结果为:[1,2,3]
public class StringTest {
    public static void main(String[] args) {
        int[]arr={1,2,3};
        String str=arrToString(arr);
        System.out.println(str);
    }
    public static String arrToString(int[]arr){
        StringBuilder sb=new StringBuilder();
        sb.append("[");
        for (int i = 0; i < arr.length; i++) {
            if(i==arr.length-1){
                sb.append(arr[i]);
            }
            else{
                sb.append(arr[i]).append(",");
            }
        }
        sb.append("]");
        return sb.toString();
    }
}

6.StringJoiner

StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。

作用:提高字符串的操作效率,而且代码编写特别简洁。

7.字符串相关类的底层原理

 一个加号,堆内存里两个对象。

结论:如果很多字符串变量拼接,不要直接“+”。在底层会创建多个对象,浪费时间,浪费性能。

 

8.较难练习

(1)罗马数字的写法

  • 转换罗马数字
  • 要求1:长度为小于等于9
  • 要求2:只能是数字
  • 将内容变成罗马数字
  • 下面是阿拉伯数字跟罗马数字的对比关系:
import java.util.Scanner;

public class StringTest {
    public static void main(String[] args) {
        //1~9:I ,II ,III,IV ,V ,VI,VII ,VIII ,IX
        //1。输入字符串
        Scanner sc=new Scanner(System.in);
        while (true) {
            System.out.print("请输入都为数字的字符串:");
            String str=sc.next();
            //2.判断字符串是否符合条件,全为数字,数据有误就重新输入
            boolean flag=checkNum(str);
            if(flag){
            //3.将数字变成罗马数字,并拼接
                String result=changeLuoMa(str);
                System.out.println(result);
                break;
            }
        }

    }
    //这里还可以使用switch case实现。case'1'->str="I";
    public static String changeLuoMa(String str){
        String result="";
        String[]arr={" ","I","II","III","IV","V","VI","VII","VIII","IX"};
        for (int i = 0; i < str.length(); i++) {
            //str.charAt(i)-48是将字符转换成数字。比如9的ascii码是57,57-48=9。
            int strSingleNum=str.charAt(i)-48;
            String strSingle=arr[strSingleNum];
            result=result+strSingle+" ";
        }
        return result;
    }
    public static boolean checkNum(String str){
        if(str.length()>9){
            System.out.println("数据范围有误,请重新输入");
            return false;
        }
        for (int i = 0; i < str.length(); i++) {
            char strSingle=str.charAt(i);
            if(strSingle<=48||strSingle>=57){
                System.out.println("数据有误,请重新输入");
                return false;
            }
        }
        return true;
    }
}

(2)调整字符串内容并比较

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

//方法一
public class StringTest {
    public static void main(String[] args) {
        //1.定义字符串
        String strA="abcde";
        String strB="cdeab";
        //2.旋转字符串A,方法:rotate
        //3.循环判断A,B字符串是否相同,调用check方法
        boolean flag=check(strA,strB);
        System.out.println(flag);
    }
    public static boolean check(String strA,String strB) {
        for (int i = 0; i < strA.length(); i++) {
            strA=rotate(strA);
            if(strA.equals(strB)){
                return true;
            }
        }
        return false;
    }
    public static String rotate(String str) {
        String first=str.substring(0,1);
        String end=str.substring(1, str.length());
        String result=end+first;
        return result;
    }
}
//方法二
public class StringTest {
    public static void main(String[] args) {
        //1.定义字符串
        String strA="abcde";
        String strB="cdeab";
        //2.旋转字符串A,方法:rotate
        //3.循环判断A,B字符串是否相同,调用check方法
        boolean flag=check(strA,strB);
        System.out.println(flag);
    }
    public static boolean check(String strA,String strB) {
        //字符转字符数组toCharArray(),然后再将字符数组变成字符串
        char[]arr=strA.toCharArray();
        for (int j = 0; j < strA.length(); j++) {
            char temp=arr[0];
            for (int i = 0; i < strA.length()-1; i++) {
                arr[i]=arr[i+1];
            }
            arr[strA.length()-1]=temp;
            //字符数组变成字符串
            String result=new String(arr);
            if (result.equals(strB)){
                System.out.println(result);
                return true;
            }
        }
        return false;
    }
}

9.后续练习思路分析

  • 键盘输入任意字符串,打乱里面的内容
import java.util.Random;
import java.util.Scanner;

public class StringTest {
    public static void main(String[] args) {
        //1.输入任意字符串
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入一个字符串:");
        String str=sc.next();
        //2.字符串转字符数组
        char[]arr=str.toCharArray();
        //3.生成随机数
        Random r=new Random();
        //4.随机交换
        for (int i = 0; i < arr.length; i++) {
            int random=r.nextInt(arr.length);
            char temp=arr[i];
            arr[i]=arr[random];
            arr[random]=temp;
        }
        String result=new String(arr);
        System.out.println(result);
    }
}
  • 生成验证码
  • 内容:可以是小写字母,也可以是大写字母,还可以是数字
  • 规则:
  • 长度为5
  • 内容中是四位字母,1位数字。
  • 其中数字只有1位,但是可以出现在任意的位置。
import java.util.Random;

public class StringTest {
    public static void main(String[] args) {
        //1.定义两个数组分别存放A-Z、a-z和0-9
        char[]arr={
                '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'
        };
        char[]arrNum={'0','1','2','3','4','5','6','7','8','9',};
        //2.生成随机数,获取4个字母,1个数字
        String resultEnd=getWordsNum(arr,arrNum);
        //3.将4字母+1数字的结果打乱
        exchange(resultEnd);
    }

    public static String getWordsNum(char[]arr,char[]arrNum) {
        Random r=new Random();
        String result="";
        for (int i = 0; i < 4; i++) {
            int randomIndex=r.nextInt(arr.length);
            result=result+arr[randomIndex];
        }
        int randomIndexNum=r.nextInt(arrNum.length);
        char resultNum=arrNum[randomIndexNum];
        String resultEnd=result+resultNum;
        return resultEnd;
    }
    public static void exchange(String resultEnd) {
        Random r=new Random();
        char []arrNew=resultEnd.toCharArray();
        int index=r.nextInt(arrNew.length);
        for (int i = 0; i < arrNew.length; i++) {
            char temp=arrNew[i];
            arrNew[i]=arrNew[index];
            arrNew[index]=temp;
        }
        String result=new String(arrNew);
        System.out.println(result);
    }
}
  • 给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。
public class StringTest {
    public static void main(String[] args) {
        //1.定义字符串
        String num1="123456";
        String num2="123";
        //2.将字符串换成数字进行拼接
        int number1=strToNum(num1);
        int number2=strToNum(num2);
        //查看转换结果是否正确
//        System.out.println(number1);
//        System.out.println(number2);
        //3.计算乘积
        int result=number1*number2;
        System.out.println(result);

    }
    public static int strToNum (String num) {
        char[]arr1=num.toCharArray();
        int result1=0;
        for (int i = 0; i < arr1.length; i++) {
            result1=result1*10+(arr1[i]-48);
        }
        return result1;
    }
}
  • 给你一个字符串s,由若干单词组成,单词前后有一些空格字符隔开。返回最后一个单词的长度。单词是指仅由字母组成,不包含任何空格字符的最大子字符串。
  • 例如:输入s="Hello World"   输出:5
public class StringTest {
    public static void main(String[] args) {
        //1.给定字符串s
        String s="Today is unlucky day";
        //2.反向遍历,遇到空格就结束
        char[]arr=s.toCharArray();
        int count=0;
        for (int i = arr.length-1; i >=0 ; i--) {
            if (arr[i]==' '){
                break;
            }
            else {
                count++;
            }
        }
        System.out.println(count);
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值