• Java学习笔记2024/2/20


    今日作业:

    题目1

    完成课堂上所有练习

    package test.test1;
    ​
    import java.util.Random;
    ​
    public class Test3 {
    ​
            public static void main(String[] args) {
                //键盘输入任意字符串,打乱里面的内容
    ​
                //1.键盘输入任意字符串
                String str = "abcdefg";
    ​
                //2.打乱里面的内容
                //修改字符串里面的内容:
                //1.subString
                //2.变成字符数组
                char[] arr = str.toCharArray();//['a','b','c','d','e','f','g']
    ​
                //3.打乱数组里面的内容
                //从0索引开始,跟一个随机索引进行位置的交换
                //当数组里面的每一个元素都跟一个随机索引进行交换完毕之后,那么内容就打乱了
                for (int i = 0; i < arr.length; i++) {
                    Random random = new Random();
                    int r = random.nextInt(str.length());
                    char temp = arr[i];
                    arr[i] = arr[r];
                    arr[r] = temp;
                }
    ​
                //4.把字符数组再变回字符串
                String result = new String(arr);
    ​
                System.out.println(result);
            }
            
        }
    package test.test2;
    ​
    import java.util.Random;
    ​
    public class Test4 {
        public static void main(String[] args) {
           /*
            生成验证码
            内容:可以是小写字母,也可以是大写字母,还可以是数字
            规则:
            长度为5
            内容中是四位字母,1位数字。
            其中数字只有1位,但是可以出现在任意的位置。*/
    ​
            //1.可以把所有的大写字母,小写字母都放到一个数组当中
            char[] arr = new char[52];
            //a-z  A-Z
            for (int i = 0; i < arr.length; i++) {
    ​
                if (i <= 25) {
                    arr[i] = (char) ('a' + i);//强制转换
                } else {
                    arr[i] = (char) ('A' + i - 26);
                }
    ​
            }
    ​
            Random random = new Random();
            char[] k = new char[4];
            //2.从数组中随机获取4次
            for (int i = 0; i < arr.length; i++) {
                int r = random.nextInt(52);//3~52,52-3=49,49+1=(50),0~(50) + 3 = 3 ~ (50)
                k[i] = arr[r];
                if (i == 3) {
                    break;
                }
            }
            String re = "";
            for (int i = 0; i < k.length; i++) {
                re = re + k[i];
            }
            //3.生成一个0~9之间的随机数拼接到最后
            //ACFG7
            //思考,我们把7放到前面,修改了字符串的内容
            //把生成的验证码先变成一个字符数组
            //再让最后一个元素跟前面的随机位置的元素进行交换
            //交换完毕之后再变成字符串就可以了。
            int num = random.nextInt(10);
            re = re + num;
            System.out.println(re);
    ​
            //把生成的验证码先变成一个字符数组
            char[] brr = re.toCharArray();
            for (int i = 0; i < brr.length-1;) {
                int ran = random.nextInt(4);//0~3,3-0=3,3+1=(4),0~(4)+0,0~(4)
                char temp = brr[brr.length-1];
                brr[brr.length-1] = brr[ran];
                brr[ran] = temp;
                break;
            }
            for (int i = 0; i < brr.length; i++) {
                System.out.println(brr[i]);
            }
    ​
            //交换完毕之后再变成字符串就可以了。
            String result = new String(brr);
            System.out.println(result);
            
        }
        
    }
    package test.test1;
    ​
    public class Test5 {
        public static void main(String[] args) {
            /* 给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。
            注意:需要用已有的知识完成。*/
    ​
            //不需要考虑乘积过大之后的结果
            //就认为乘积一定是小于int的最大值的
    ​
    ​
            String num1 = "12345";
            String num2 = "123";
    ​
            //1.把num1和num2变成对应的整数才可以
            //"123456789"
            //先遍历字符串依次得到每一个字符 '1'  '2'  '3'  '4'  '5'  '6'  '7'  '8'  '9'
            //再把字符变成对应的数字即可     1    2    3     4    5    6    7    8    9
            //把每一个数字组合到一起 123456789
            int re1 = 0;
            re1 = getRe(num1, re1);
            System.out.println(re1);
            int re2 = 0;
            re2 = getRe(num2, re2);
            System.out.println(re2);
            //2.利用整数进行相乘
            int re = re1 * re2;
            System.out.println(re);
    ​
            //3.可以把整数变成字符串
            //+""
            String s = "";
            s = s + re;
            System.out.println(s);
    ​
        }
    ​
        private static int getRe(String num, int re) {
            for (int i = 0; i < num.length(); i++) {
                char n = num.charAt(i);//可以自己遍历字符串,也可以转化为字符数组再遍历
                int s = changeNumber(n);
                re = re * 10 + s;
            }
            return re;
        }
    ​
        public static int changeNumber(char number) {
            int str = switch (number) {
                case '1' -> 1;
                case '2' -> 2;
                case '3' -> 3;
                case '4' -> 4;
                case '5' -> 5;
                case '6' -> 6;
                case '7' -> 7;
                case '8' -> 8;
                case '9' -> 9;
                default -> -1;
            };
            return str;
    ​
        }
    ​
    }
    package test.test1;
    ​
    public class Test6 {
    ​
        public static void main(String[] args) {
          /* 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。
            返回字符串中最后一个单词的长度。
            单词是指仅由字母组成、不包含任何空格字符的最大子字符串。
    ​
            示例 1:输入:s = "Hello World“   输出:5
            解释:最后一个单词是“World”,长度为5。
    ​
            示例 2:输入:s = "   fly me   to   the moon" 输出:4
            解释:最后一个单词是“moon”,长度为4。
    ​
            示例 3:输入:s = "luffy is still joyboy" 输出:6
            解释:最后一个单词是长度为6的“joyboy”。*/
    ​
            //倒着遍历
            //直到遇到空格为止   //字符串的比较用equeals,字符的比较用==
            //那么遍历的次数就是单词的长度
    ​
            String s = "   fly me   to   the moon";
    ​
            int count = 0;
            char c = ' ';
            for (int i = s.length() - 1; i >= 0; i--) {
                char n = s.charAt(i);
                if (n == c) {  //字符不能够跟字符串比较,要化为一个类型
                    break;
                }
                count++;
    ​
            }
            System.out.println(count);
    ​
        }
    ​
    }

    题目2

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

    训练目标

    随机数类Random相关API、字符串相关API

    训练提示

    1、字符串是不可变的

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

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

    参考答案

    package test.test1;
    ​
    import java.util.Random;
    ​
    public class Test3 {
    ​
            public static void main(String[] args) {
                //键盘输入任意字符串,打乱里面的内容
    ​
                //1.键盘输入任意字符串
                String str = "abcdefg";
    ​
                //2.打乱里面的内容
                //修改字符串里面的内容:
                //1.subString
                //2.变成字符数组
                char[] arr = str.toCharArray();//['a','b','c','d','e','f','g']
    ​
                //3.打乱数组里面的内容
                //从0索引开始,跟一个随机索引进行位置的交换
                //当数组里面的每一个元素都跟一个随机索引进行交换完毕之后,那么内容就打乱了
                for (int i = 0; i < arr.length; i++) {
                    Random random = new Random();
                    int r = random.nextInt(str.length());
                    char temp = arr[i];
                    arr[i] = arr[r];
                    arr[r] = temp;
                }
    ​
                //4.把字符数组再变回字符串
                String result = new String(arr);
    ​
                System.out.println(result);
            }
            
        }

    题目3

    训练目标:

    生成验证码

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

    规则:

    长度为5
    ​
    内容中是四位字母,1位数字。
    ​
    其中数字只有1位,但是可以出现在任意的位置。

    参考答案

    package test.test1;
    ​
    import java.util.Random;
    ​
    public class Test4 {
        public static void main(String[] args) {
           /*
            生成验证码
            内容:可以是小写字母,也可以是大写字母,还可以是数字
            规则:
            长度为5
            内容中是四位字母,1位数字。
            其中数字只有1位,但是可以出现在任意的位置。*/
    ​
            //1.可以把所有的大写字母,小写字母都放到一个数组当中
            char[] arr = new char[52];
            //a-z  A-Z
            for (int i = 0; i < arr.length; i++) {
    ​
                if (i <= 25) {
                    arr[i] = (char) ('a' + i);//强制转换
                } else {
                    arr[i] = (char) ('A' + i - 26);
                }
    ​
            }
    ​
            Random random = new Random();
            char[] k = new char[4];
            //2.从数组中随机获取4次
            for (int i = 0; i < arr.length; i++) {
                int r = random.nextInt(52);//3~52,52-3=49,49+1=(50),0~(50) + 3 = 3 ~ (50)
                k[i] = arr[r];
                if (i == 3) {
                    break;
                }
            }
            String re = "";
            for (int i = 0; i < k.length; i++) {
                re = re + k[i];
            }
            //3.生成一个0~9之间的随机数拼接到最后
            //ACFG7
            //思考,我们把7放到前面,修改了字符串的内容
            //把生成的验证码先变成一个字符数组
            //再让最后一个元素跟前面的随机位置的元素进行交换
            //交换完毕之后再变成字符串就可以了。
            int num = random.nextInt(10);
            re = re + num;
            System.out.println(re);
    ​
            //把生成的验证码先变成一个字符数组
            char[] brr = re.toCharArray();
            for (int i = 0; i < brr.length-1;) {
                int ran = random.nextInt(4);//0~3,3-0=3,3+1=(4),0~(4)+0,0~(4)
                char temp = brr[brr.length-1];
                brr[brr.length-1] = brr[ran];
                brr[ran] = temp;
                break;
            }
            for (int i = 0; i < brr.length; i++) {
                System.out.println(brr[i]);
            }
    ​
            //交换完毕之后再变成字符串就可以了。
            String result = new String(brr);
            System.out.println(result);
            
        }
        
    }

    题目4

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

    训练目标

    字符串遍历

    训练提示

    1、键盘录入一个字符串,用 Scanner 实现 2、要统计两种类型的字符个数,需定义两个统计变量,初始值都为0 3、遍历字符串,得到每一个字符 4、判断该字符属于哪种类型,然后对应类型的统计变量+1,判断字母时需要考虑大小写,条件比较复杂,怎样做才能使判断更简单呢?

    训练步骤

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

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

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

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

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

    参考答案

    package test.test4;
    ​
    import java.util.Scanner;
    ​
    public class test4 {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("输入一个字符串");
            //比如:Hello12345World中字母:10个,数字:5个。
            String str = scanner.nextLine();
            //next()、nextInt()、nextDouble()这三个配套使用。
            //nextLine()单独使用。
            str = str.toLowerCase();
            System.out.println(str);
    ​
            int count1 = 0;
            int count2 = 0;
            
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                if (c >= '0' && c <= '9') {
                    count1++;
                }
    ​
                if(c >= 'a' && c <= 'z'){
                    count2++;
                }
    ​
            }
    ​
            System.out.println("数字有:" + count1 + "个");
            System.out.println("英文字母有:" + count2 + "个");
            
        }
    ​
    }
    ​

    题目5

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

    训练目标

    字符串的反转功能,判断是否相等功能

    训练提示

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

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

    训练步骤

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

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

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

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

    参考答案

    package test.test5;
    ​
    public class test5 {
        public static void main(String[] args) {
            String str = "abcba";
            boolean re = getFan(str);
            System.out.println(re);
    ​
        }
    ​
        public static boolean getFan(String str) {
            StringBuilder str1 = new StringBuilder(str);
            String s = str1.reverse().toString();//此时的str1如果不加toString就只是一个容器,容器无法与字符串比较
            //StringBuilder相当于一个容器,将字符串拿到容器里面进行各种操作,操作完了之后还得重新将字符串拿出来
            if (s.equals(str)) {
                return true;
            } else {
                return false;
            }
    ​
        }
    ​
    }
    ​

    题目6

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

    训练目标

    字符串的遍历、判断

    训练提示

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

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

    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()方法,获取用户输入,调用方法,传递参数,查看结果。要多运行几次,判断各种不符合条件的数据。

    参考答案

    package test.test6;
    ​
    import java.util.Scanner;
    ​
    public class test6 {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("输入身份证号");
            String id = scanner.nextLine();
            boolean flag = pdId(id);
            System.out.println(flag);
    ​
        }
        public static boolean pdId(String id) {
            if (id.length() != 18) {
                return false;
            }
    ​
            if (id.charAt(0) == '0') {
                return false;
            }
    ​
            for (int i = 0; i < id.length(); i++) {
                if (i == id.length() - 1) {
    ​
                    if ((id.charAt(i) >= '1' && id.charAt(i) <= '9') || id.charAt(i) == 'X') {
    ​
                    } else {
                        return false;
                    }
    ​
                } else {
    ​
                    if (id.charAt(i) >= '0' && id.charAt(i) <= '9') {
    ​
                    } else {
                        return false;
                    }
    ​
                }
    ​
            }
    ​
            return true;
    ​
        }
    ​
    }
    ​

    题目7

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

    要求:

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

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

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

    训练目标

    字符串的拼接

    训练提示

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

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

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

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

    5、将字符串返回

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

    训练步骤

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

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

    3、创建StringBuilder对象

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

    5、将StringBuilder转为String返回

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

    参考答案

    package test.test7;
    ​
    public class test7 {
        public static void main(String[] args) {
            int[] arr = {1,2,3};
            String str = getStr(arr);
            System.out.println(str);
        }
    ​
        public static String getStr(int[] arr) {
            if (arr == null) {
                return null;
            }
            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]+",");
                }
            }
            sb.append("]");
            return sb.toString();
    ​
        }
    ​
    }
    ​

    题目8(扩展)

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

    // 查找参数字符串"Java"在调用方法的字符串中第一次出现的索引,如果不存在,返回-1
    public int indexOf(String "Java")
    ​
    // 截取字符串,从索引beginIndex(包含)开始到字符串的结尾
    public String substring(int beginIndex)

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

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

    训练目标

    String类API的灵活使用

    训练提示

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

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

    训练步骤

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

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

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

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

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

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

    7、将统计变量返回

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

    参考答案

    package test.test8;
    ​
    public class test8 {
        public static void main(String[] args) {
            String str1 = "Java语言是面向对象的,Java语言是健壮的,Java语言是安全的,Java是高性能的,Java语言是跨平台的";
            String str2 = "Java";
            int count = getCount(str1, str2);
            System.out.println(count);
        }
    ​
        public static int getCount(String str1, String str2) {
            int count = 0;
            int index;
            while ((index = str1.indexOf(str2)) != -1) {
                count++;
                str1 = str1.substring(index + str2.length());
            }
            return count;
    ​
        }
    ​
    }
    ​
  • 相关阅读:
    VSCode使用
    python setup.py 打包缺少静态资源
    解决: 使用html2canvas和print-js打印组件时, 出现空白页
    android——服务JobService
    Go 以小端字节序修改文件
    Tensorflow Federated Framework 谷歌联邦学习框架
    2023年的深度学习入门指南(26) - 在自己电脑上运行通义千问7b模型
    深入探索SDL游戏开发
    复旦EMBA美东国际课程走进哈佛、耶鲁、麻省理工、哥大等顶尖名校
    《线性代数》科教版教材必会习题
  • 原文地址:https://blog.csdn.net/2201_75933645/article/details/136198542