题目集4~6的总结性Blog
(1)前言:总结三次题目集的知识点、题量、难度等情况
1.第四次作业:7-1 水文数据校验及处理
主要考察了正则表达式的运用。
7-2 日期问题面向对象设计(聚合一)
主要考察类的设计。
7-3 图形继承 (15 分)
主要考察了类的继承相关的知识点。
第四次作业题量虽然不多,但是其难度比较的大。考察的都是新的知识点。
2.第五次作业:
7-1 找出最长的单词-hebust (5 分)
考察了字符串的相关的方法。
7-2 合并两个有序数组为新的有序数组 (15 分)
主要考察了System.arraycopy的这个方法。进行数组的合并!
7-3 对整型数据排序 (15 分)
主要考察了数组的三种的排序算法:
插入排序
选择排序
冒泡排序
7-4 统计Java程序中关键词的出现次数 (25 分)
主要考察了List、Set或Map相关的接口。
7-5 日期问题面向对象设计(聚合二) (40 分)
主要考察了类的相关设计与及其相关的依赖。
3.第六次作业
7-1 正则表达式训练-QQ号校验
7-3 正则表达式训练-验证码校验
7-4 正则表达式训练-学号校验
主要考察了正则表达式的运用。
7-2 字符串训练-字符排序
主要考察了字符串的相关知识点。
7-5 图形继承与多态
主要考察了类的继承和多态。
7-6 实现图形接口及多态性 (30 分)
主要考察接口的使用。
(2)设计与分析
①题目集4(7-2)、题目集5(7-5)两种日期类聚合设计的优劣比较
题目集4(7-2)
参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

应用程序共测试三个功能:
- 求下n天
- 求前n天
- 求两个日期相差的天数
注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)
输入格式:
有三种输入方式(以输入的第一个数字划分[1,3]):
- 1 year month day n //测试输入日期的下n天
- 2 year month day n //测试输入日期的前n天
- 3 year1 month1 day1 year2 month2 day2 //测试两个日期之间相差的天数
输出格式:
- 当输入有误时,输出格式如下:
Wrong Format - 当第一个数字为1且输入均有效,输出格式如下:
year-month-day - 当第一个数字为2且输入均有效,输出格式如下:
year-month-day - 当第一个数字为3且输入均有效,输出格式如下:
天数值
输入样例1:
在这里给出一组输入。例如:
3 2014 2 14 2020 6 14
输出样例1:
在这里给出相应的输出。例如:
2312
输入样例2:
在这里给出一组输入。例如:
2 1935 2 17 125340
输出样例2:
在这里给出相应的输出。例如:
1591-12-17
输入样例3:
在这里给出一组输入。例如:
1 1999 3 28 6543
输出样例3:
在这里给出相应的输出。例如:
2017-2-24
输入样例4:
在这里给出一组输入。例如:
0 2000 5 12 30
输出样例4:
在这里给出相应的输出。例如:
Wrong Format
7-5 日期问题面向对象设计(聚合二)
参考题目7-3的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

应用程序共测试三个功能:
- 求下n天
- 求前n天
- 求两个日期相差的天数
注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)
输入格式:
有三种输入方式(以输入的第一个数字划分[1,3]):
- 1 year month day n //测试输入日期的下n天
- 2 year month day n //测试输入日期的前n天
- 3 year1 month1 day1 year2 month2 day2 //测试两个日期之间相差的天数
输出格式:
- 当输入有误时,输出格式如下:
Wrong Format - 当第一个数字为1且输入均有效,输出格式如下:
year1-month1-day1 next n days is:year2-month2-day2 - 当第一个数字为2且输入均有效,输出格式如下:
year1-month1-day1 previous n days is:year2-month2-day2 - 当第一个数字为3且输入均有效,输出格式如下:
The days between year1-month1-day1 and year2-month2-day2 are:值
输入样例1:
在这里给出一组输入。例如:
3 2014 2 14 2020 6 14
输出样例1:
在这里给出相应的输出。例如:
The days between 2014-2-14 and 2020-6-14 are:2312
输入样例2:
在这里给出一组输入。例如:
2 1834 2 17 7821
输出样例2:
在这里给出相应的输出。例如:
1834-2-17 previous 7821 days is:1812-9-19
输入样例3:
在这里给出一组输入。例如:
1 1999 3 28 6543
输出样例3:
在这里给出相应的输出。例如:
1999-3-28 next 6543 days is:2017-2-24
输入样例4:
在这里给出一组输入。例如:
0 2000 5 12 30
输出样例4:
在这里给出相应的输出。例如:
Wrong Format
显然7-5 日期问题面向对象设计(聚合二)的优势更好。
因为相关的类都和DateUtil有相关的关联。
聚合一的相关代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int year = 0;
int month = 0;
int day = 0;
int choice = input.nextInt();
if (choice == 1) { // test getNextNDays method
int m = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
m = input.nextInt();
if (m < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(date.getDay().getMonth().getYear().getValue() + "-" + date.getDay().getMonth().getValue()
+ "-" + date.getDay().getValue() + " next " + m + " days is:");
System.out.println(date.getNextNDays(m).showDate());
} else if (choice == 2) { // test getPreviousNDays method
int n = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
n = input.nextInt();
if (n < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(date.getDay().getMonth().getYear().getValue() + "-" + date.getDay().getMonth().getValue()
+ "-" + date.getDay().getValue() + " previous " + n + " days is:");
System.out.println(date.getPreviousNDays(n).showDate());
} else if (choice == 3) { // test getDaysofDates method
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
int anotherYear = Integer.parseInt(input.next());
int anotherMonth = Integer.parseInt(input.next());
int anotherDay = Integer.parseInt(input.next());
DateUtil fromDate = new DateUtil(year, month, day);
DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);
if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
System.out.println("The days between " + fromDate.showDate() + " and " + toDate.showDate() + " are:"
+ fromDate.getDaysofDates(toDate));
} else {
System.out.println("Wrong Format");
System.exit(0);
}
} else {
System.out.println("Wrong Format");
System.exit(0);
}
}
}
聚合二的相关代码
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int year = 0;
int month = 0;
int day = 0;
int choice = input.nextInt();
if (choice == 1) { // test getNextNDays method
int m = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
m = input.nextInt();
if (m < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(date.showDate() + " next " + m + " days is:");
System.out.println(date.getNextNDays(m).showDate());
} else if (choice == 2) { // test getPreviousNDays method
int n = 0;
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
DateUtil date = new DateUtil(year, month, day);
if (!date.checkInputValidity()) {
System.out.println("Wrong Format");
System.exit(0);
}
n = input.nextInt();
if (n < 0) {
System.out.println("Wrong Format");
System.exit(0);
}
System.out.print(date.showDate() + " previous " + n + " days is:");
System.out.println(date.getPreviousNDays(n).showDate());
} else if (choice == 3) { // test getDaysofDates method
year = Integer.parseInt(input.next());
month = Integer.parseInt(input.next());
day = Integer.parseInt(input.next());
int anotherYear = Integer.parseInt(input.next());
int anotherMonth = Integer.parseInt(input.next());
int anotherDay = Integer.parseInt(input.next());
DateUtil fromDate = new DateUtil(year, month, day);
DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);
if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
System.out.println("The days between " + fromDate.showDate() + " and " + toDate.showDate() + " are:"
+ fromDate.getDaysofDates(toDate));
} else {
System.out.println("Wrong Format");
System.exit(0);
}
} else {
System.out.println("Wrong Format");
System.exit(0);
}
}
}
②题目集4(7-3)、题目集6(7-5、7-6)
1.三种渐进式图形继承设计的思路
把相关的共同方法抽象出来,形成抽象类 。让相关的类继承它。
例如
public void getArea(){}
就可以进行抽象出来。成为抽象类的相关的方法。
2.技术运用(封装、继承、多态、接口等)
运用了继承的方法。
继承的作用:代码复用。有了继承才有后面的方法的重写和多态。
③三次题目集中用到的正则表达式技术的分析总结
运用了正则表达式的分割。及其相关的匹配技术。
④题目集5(7-4)中Java集合框架应用的分析总结
没有做出来,暂时无法解释。
3)采坑心得
1.初做继承类相关的题目时,不知道子类可以自动生成继承方法。以至于浪费了好多时间来手写相关的代码。
2.不知道有数组合并的相关的方法System.arraycopy写了些本可以不写的代码。
题目如下:
合并两个升序排序的整型数组为一个新的升序整型数组并输出。
输入格式:
首先输入第一个数组的数据个数后输入第一个数组按升序排序的数据,然后再输入第二个数组的数据个数,最后输入第二个数据按升序排序的数据。数据之间用一个或多个空格或回车符分隔。
输出格式:
输出合并后按升序排序的数组的元素,元素之间用一个空格分隔。(注意输出的最后一个元素后会有一个空格符)
输入样例:
在这里给出一组输入。例如:
4
1 2 8 10
5
-1 5 6 20 200
输出样例:
在这里给出相应的输出。例如:
-1 1 2 5 6 8 10 20 200
刚开始做这个题目的时候不晓得这题可以用System.arraycopy的方法导致手写重复了许多的相关代码。
附上相关的代码
import java.util.*;
public class Main {
public static void main(String[] PTA4No2) {
Scanner input=new Scanner(System.in);
//array1
int array1_length=input.nextInt();
int[] array1=new int[array1_length];
for(int i=0;i<array1_length;i++)
{
array1[i]=input.nextInt();
}
//array2
int array2_length=input.nextInt();
int[] array2=new int[array2_length];
for(int i=0;i<array2_length;i++)
{
array2[i]=input.nextInt();
}
//合并array1,array2数组
int[] arraycombine=new int[array1_length+array2_length];
System.arraycopy(array1, 0, arraycombine, 0, array1_length);
System.arraycopy(array2, 0, arraycombine, array1_length, array1_length + array2_length - array1_length);
Arrays.sort(arraycombine);
for(int i=0;i<(array1_length+array2_length);i++)
System.out.print(arraycombine[i]+" ");
System.exit(0);
}
}
4)改进建议:
暂时无。
5)总结
学会了正则表达式的相关运用。
学会了类的继承,多态。接口的相关的知识。
6)相关的源码
浙公网安备 33010602011771号