常用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