21-JavaSE基础巩固练习:常用API的五道练习题

常用API的五道综合练习

练习

1、键盘录入
  • 需求:键盘录入一些1~100之间的整数,并添加到集合中,直到集合中所有数据和超过200为止。
package com.app.comprehensive12;

import java.util.ArrayList;
import java.util.Scanner;

public class APITest10 {
    public static void main(String[] args) {
        /*
            API综合练习:键盘录入
                需求:键盘录入一些1~100之间的整数,并添加到集合中,直到集合中所有数据和超过200为止。
         */
        // 1、创建键盘录入对象,用于键盘录入1~100之间的整数
        Scanner sc = new Scanner(System.in);
        // 2、创建List集合,用于存储整数数据
        ArrayList<Integer> list = new ArrayList<>();
        // 3、定义while死循环
        while (true) {
            System.out.println("请您输入一个1~100之间的整数:");
            // 4、将接收到的字符串转换成整数类型,并用变量接收
            int number = Integer.parseInt(sc.nextLine());
            // 5、判断输入的整数是否超出1~100的范围
            if (number < 1 || number > 100) {
                System.out.println("您输入的整数不在1~100范围内!请重新输入~");
                // 跳出当次循环,进入下一次循环!
                continue;
            }
            // 6、将输入的整数存储到集合中
            /*
                细节:
                    number:基本数据类型int
                    集合里面的数据是Integer
                    在添加数据的时候会触发自动装箱
             */
            // list.add(Integer.valueOf(number));
            list.add(number);
            // 7、对集合中所有的数据进行求和
            int sum = getSum(list);
            // 8、判断sum是否超过200
            if (sum > 200) {
                // 是
                System.out.println("集合中所有数据和已经超过200!");
                break;
            }
            // 否,则继续循环!
        }

        // 9、查看集合中所有的数据
        System.out.println("---------查看集合中所有的数据----------");
        queryList(list);
    }

    /**
     * 查看集合中所有的数据
     */
    private static void queryList(ArrayList<Integer> list) {
        // 遍历集合,依次获取集合中的每个数据
        for (int i = 0; i < list.size(); i++) {
            int number = list.get(i);
            System.out.print(number + " ");
        }
    }

    /**
     * 对集合中所有的数据进行求和
     * @param list  集合
     * @return      返回求和结果
     */
    private static int getSum(ArrayList<Integer> list) {
        // 定义sum变量,用于记录求和结果
        int sum = 0;
        // 遍历集合,依次获取集合中的每个数据
        for (int i = 0; i < list.size(); i++) {
            /*
                number是基本数据类型int
                list集合是Integer引用类型
                在使用get(int 索引)方法获取集合中的数据 赋值给 number变量的时候,
                会触发自动拆箱。
             */
            int number = list.get(i);
            // 累加数据:求和
            sum += number;
        }
        // 累加结束!求和完毕!返回求和结果给方法调用处!
        return sum;
    }
}
请您输入一个1~100之间的整数:
0
您输入的整数不在1~100范围内!请重新输入~
请您输入一个1~100之间的整数:
199
您输入的整数不在1~100范围内!请重新输入~
请您输入一个1~100之间的整数:
1
请您输入一个1~100之间的整数:
100
请您输入一个1~100之间的整数:
59
请您输入一个1~100之间的整数:
101
您输入的整数不在1~100范围内!请重新输入~
请您输入一个1~100之间的整数:
100
集合中所有数据和已经超过200!
---------查看集合中所有的数据----------
1 100 59 100 
Process finished with exit code 0



2、算法水题:自己实现parseInt方法
  • 需求:自己实现parseInt方法的效果,将字符串形式的数据转换成整数。
  • 要求:
    • 字符串中只能是数字不能有其他字符
    • 最少1位,最多10位
    • 0不能开头
package com.app.comprehensive12;

import java.util.Scanner;

/*
    定义自己的Integer类
 */
class MyInteger {
    /**
     * 定义自己的parseInt方法
     * @param s 字符串
     * @return  返回转换后的结果
     */
    public static int myParseInt(String s) {
        // 正则表达式校验字符串是否符合要求
        /*
            要求:字符串中只能是数字不能有其他字符
                 最少1位,最多10位
                 0不能开头
         */
        // 习惯:会先把异常数据进行过滤,剩下的就是正常的数据
        if (!s.matches("[1-9]\\d{0,9}")) {
            // 错误的数据,返回-1
            return -1;
        }

        // 正确的数据
        // 定义变量,用于接收最终的转换结果
        int number = 0;
        // 得到字符串的每个字符
        for (int i = 0; i < s.length(); i++) {
            /*
                假如i索引的字符为1,1的ASCII码是49,49-48=1,这样就可以将字符1转换成数字1了
                假如i索引的字符为2,2的ASCII码是50,50-48=2,这样就可以将字符2转换成数字2了
                其他的以此类推!
             */
            int c = s.charAt(i) - '0';

            /*
                通过将number变量的 值*10+c
                假如number的初始值值为0, c的值为1, 那么0*10=0, 0+1=1
                此时number的值为1,c的值为2,那么1*10=10, 10+2=12
                此时number的值为12,c的值为3,那么12*10=120, 120+3=123
                其他的以此类推!
             */
            number = number * 10 + c;
        }
        // 循环结束!转换成功!返回结果给方法调用处!
        return number;
    }
}

public class APITest11 {
    public static void main(String[] args) {
        /*
            需求:自己实现parseInt方法的效果,将字符串形式的数据转换成整数。
            要求:字符串中只能是数字不能有其他字符
                 最少1位,最多10位
                 0不能开头
         */
        // 1.创建键盘录入对象,用于从键盘录入数据
        Scanner sc = new Scanner(System.in);
        // 2.输入字符串
        while (true) {
            System.out.println("请您输入整数:");
            // a.接收字符串
            String numberStr = sc.nextLine();
            // b.将字符串转换成基本数据int类型
            int number = MyInteger.myParseInt(numberStr);
            // c.判断返回结果是否为-1
            if (number == -1) {
                // 是,则说明数据错误!
                System.out.println("数据错误!请重新输入~");
            }else {
                // 否,则将返回结果+1
                System.out.println(number + 1);
                break;
            }
        }
    }
}
请您输入整数:
123#$¥我是a
数据错误!请重新输入~
请您输入整数:
0123
数据错误!请重新输入~
请您输入整数:
12345678901
数据错误!请重新输入~
请您输入整数:
555
556

Process finished with exit code 0




3、算法水题:自己实现toBinaryString方法
  • 需求:定义一个方法自己实现toBinaryString方法的效果,将一个十进制整数转换成字符串表示的二进制。

  • 分析:除基取余法

    • 不断的除以基数(几进制,基数就是几)得到余数,直到余数为0,再将余数倒着拼起来。

    • 例如:

      在这里插入图片描述

package com.app.comprehensive12;

import java.util.Scanner;

public class APITest12 {
    public static void main(String[] args) {
        /*
            需求:定义一个方法自己实现toBinaryString方法的效果,将一个十进制整数转换成字符串表示的二进制。
            分析:除基取余法
               不断的除以基数(几进制,基数就是几)得到余数,直到余数为0,再将余数倒着拼起来。
         */
        // 1.创建键盘录入对象,用于输入十进制整数
        Scanner sc = new Scanner(System.in);
        // 2.录入十进制整数
        System.out.println("请您输入一个十进制整数:");
        // 将录入的十进制整数字符串转换成基本数据类型
        int number = Integer.parseInt(sc.nextLine());

        // 3、将十进制整数转换成字符串表示的二进制
        // 自己实现的toBinaryString
        System.out.println(myToBinaryString(number));
        System.out.println("-------------");
        // Integer类的toBinaryString
        System.out.println(Integer.toBinaryString(number));
    }

    /**
     * 十进制整数转换成字符串表示的二进制
     * @param number    十进制整数
     * @return          返回转换后字符串表示的二进制结果
     */
    private static String myToBinaryString(int number) {
        // 定义,用于拼接转换后的二进制
        StringBuilder sb = new StringBuilder();
        // 使用除基取余法将十进制整数转换成二进制
        while (true) {
            // 判断number是否为0
            if (number == 0) {
                // 是,转换结束!将sb转换成字符串后返回给方法调用处!
                return sb.toString();
            }

            // 获取余数
            // 假如number=6, 6%2=0
            int remainder = number % 2;
            // 将余数倒着拼接
            /*
                sb.insert(0, remainder) -->将每次计算后的余数放在0索引位置
                sb.append(remainder) -->将每次计算后的余数追加到末尾位置
             */
            sb.insert(0, remainder);

            // 将number的值除以2,得到商重新赋值给number
            // 假如number=6, 6/2=3
            number = number / 2;
        }
    }
}
请您输入一个十进制整数:
123
1111011
-------------
1111011

Process finished with exit code 0



4、算法水题:你活了多少天
  • 需求:实现计算你活了多少天,用JDK7和JDK8两种方式完成。
package com.app.comprehensive12;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Date;

public class APITest13 {
    public static void main(String[] args) throws ParseException {
        /*
            需求:实现计算你活了多少天,用JDK7和JDK8两种方式完成。
         */
        // JDK7
        // 规则:只要对时间进行计算或者判断,都需要先获取当前时间的毫秒值
        JDK7CalculatedDaysLife();

        // JDK8
        JDK8CalculateDaysLife();
    }

    private static void JDK8CalculateDaysLife() {
        /*
            Period类:侧重于计算几年几月几日
            Duration类:侧重于计算分钟、毫秒
            ChronoUnit类:所有单位都可以计算
         */
        // 1.出生年月日
        LocalDate birthday = LocalDate.of(2003, 5, 19);
        // 2.今天
        LocalDate today = LocalDate.now();
        // 3.计算间隔多少天
        // 计算规则:第二个参数 - 第一个参数
        long days = ChronoUnit.DAYS.between(birthday, today);
        System.out.println("恭喜您,存活了" + days + "天");
    }

    private static void JDK7CalculatedDaysLife() throws ParseException {
        // 1.获取出生年月日的毫秒值
        String birthday = "2003年5月19日";
        // 格式化时间
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        Date date = sdf.parse(birthday);
        long birthdayTime = date.getTime();
        // 2.获取当前时间的毫秒值
        long todayTime = System.currentTimeMillis();
        // 3.计算间隔多少天
        long time = todayTime - birthdayTime;
        System.out.println("恭喜您,存活了" + time / 1000 / 60 / 60 / 24 + "天");
    }
}
恭喜您,存活了7165天
恭喜您,存活了7165天

Process finished with exit code 0




5、算法水题:闰年和平年
  • 需求:判断任意的一个年份是闰年还是平年
  • 要求:用JDK7和JDK8两种方式判断
  • 提示:
    • 二月有29天是闰年
    • 一年有366天是闰年
package com.app.comprehensive12;

import java.time.LocalDate;
import java.util.Calendar;
import java.util.Scanner;

public class APITest14 {
    public static void main(String[] args) {
        /*
             需求:判断任意的一个年份是闰年还是平年
             要求:用JDK7和JDK8两种方式判断
             提示:
               二月有29天是闰年
               一年有366天是闰年
         */
        // JDK7
        // 1.从键盘输入年份
        Scanner sc = new Scanner(System.in);
        System.out.println("请您输入年(例:2022):");
        // 2.将字符串形式的年份转换成基本数据类型int的年份
        int year = Integer.parseInt(sc.nextLine());
        // 3.将日期设置为:输入年3月1日
        Calendar c = Calendar.getInstance();
        c.set(year, 2, 1); // 月份的范围:0~11,因此这里的2就是3
        // 4.将日期往前减1天
        c.add(Calendar.DAY_OF_MONTH, -1);

        // 5.看这一天是否为一个月中的29号?
        int day1 = c.get(Calendar.DAY_OF_MONTH);
        if (day1 == 29) {
            // 是29号,说明当前年是闰年
            System.out.println(year + "年是闰年!(JDK7)");
        }else {
            // 否则,说明当前年是平年
            System.out.println(year + "年是平年!(JDK7)");
        }

        System.out.println("----------------------");
        // JDK8
        // 1.将日期设置为:输入年3月1日
        LocalDate ld = LocalDate.of(year, 3, 1);    // 月份的范围:1~12
        // 2.将日期往前减1天
        LocalDate ld2 = ld.minusDays(1);
        // 3.看这一天是否为一个月中的29号?
        int day2 = ld2.getDayOfMonth();
        if (day2 == 29) {
            // 是29号, 说明当前年是闰年
            System.out.println(year + "年是闰年!(JDK8)");
        }else {
            // 否则,说明当前年是平年
            System.out.println(year + "年是平年!(JDK8)");
        }

        // JDK8
        // 思路2:将日期设置为往后一年,然后将日期往前减1天,如果是366天就是闰年,否则是平年
        LocalDate ld3 = LocalDate.of(year+1, 1, 1);
        LocalDate ld4 = ld3.minusDays(1);
        // 看这一天是否为一年中的366天?
        int day3 = ld4.getDayOfYear();
        if (day3 == 366) {
            // 是366天,说明当前年是闰年
            System.out.println(year + "年是闰年 ~^_^~(JDK8)");
        }else {
            // 否则是平年
            System.out.println(year + "年是平年 ~^_^~(JDK8)");
        }

        System.out.println("----------------------");

        // JDK8的isLeapYear()方法,可以直接判断当前年份是闰年还是平年
        // true: 闰年  false: 平年
        boolean flag = ld.isLeapYear();
        if (flag) {
            // 为true,说明当前年是闰年
            System.out.println(year + "年是闰年~(JDK8)");
        }else {
            // 为false,说明当前年是平年
            System.out.println(year + "年是平年~(JDK8)");
        }
    }
}
请您输入年(例:2022):
2000
2000年是闰年!(JDK7)
----------------------
2000年是闰年!(JDK8)
2000年是闰年 ~^_^~(JDK8)
----------------------
2000年是闰年~(JDK8)

Process finished with exit code 0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值