JAVA学习BLOG 02

Posted on 2021-05-02 14:37  鹿鹿666  阅读(46)  评论(0)    收藏  举报

  前言:

本次学习主要分成了三次题目集(题目集4-6),其中,题目集4有三道题、题目集5有五道题、题目集6有六道题。难度最大的为题目集4,题目集4的第一道题目就占了总分的一半(50),难度较大,在此不做分析,后两题分别为日期问题聚合一和图形继承题,难度中上;题目集5的前三题为几种排序等知识的基础题,在此不做具体分析,后两题分别为统计JAVA中关键字出现的次数和日期问题聚合二,难度中上;题目集6前四题为基础题,在此不做具体分析,后两题分别为图形继承与多态和实现图形接口及多态性,难度中等。本次学习总结所要总结的题目分别为题目集47-27-3;题目集57-4;题目集67-57-6

 

设计与分析:

1、题目集4(7-2)与题目集5(7-5)两种日期类聚合设计的优劣比较:

题目集4(7-2)类图(以下我们称为聚合1)

 

题目集5(7-5)类图(以下我们称为聚合2)

 

从类图来看,聚合1相对于聚合2来说相对较分散,聚合2相对集中些。聚合1中的DayMonthYear类中内容相对较多些,而聚合2大部分的内容都集中在Dateutil中。

聚合1Day类中包含:默认构造方法、带参构造方法、valuegetset方法、monthgetset方法、日期复位、日期设为改日最大值、校验数据合法性、日期增1、日期减1Month类中包括:默认构造方法、带参构造方法、valuegetset方法、yeargetset方法、月份复位、月份设置为12、校验数据合法性、月份增1、月份减1Year类中包括:默认构造方法、带参构造方法、valuegetset方法、判断是否为闰年、校验数据合法性、年份增1、年份减1Dateutil类中包括:默认构造方法、带参构造方法、daygetset方法、校验数据合法性、比较两个日期是否相等、日期值格式化、求下n天、求前n天、求两个日期之间的天数。

聚合2monthgetset方法、yeargetset方法都放在了Dateutil类中,并且在Dateutil中添加了日期按“年--日”格式化的方法。

两种方法相比较,聚合1相对来说每个类中的方法数较平均,检查代码过测试点更便于查看但内容相对较散,而聚合2主要的方法集中在一个类中,更统一但一个类中的方法太多不方便查看。

聚合1代码如下:

 

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n= input.nextInt();
        if(n==1)
        {
            int year = input.nextInt();
            int month = input.nextInt();
            int day = input.nextInt();
            DateUtil w=new DateUtil(year,month,day);
            int d= input.nextInt();
            if(w.validate1())
            {
                w.after(d);
            }
            else
                System.out.println("Wrong Format");
        }
        else
            if(n==2)
            {
                int year = input.nextInt();
                int month = input.nextInt();
                int day = input.nextInt();
                DateUtil w=new DateUtil(year,month,day);
                int d= input.nextInt();
                if(w.validate1())
                {
                    w.format(d);
                }
                else
                    System.out.println("Wrong Format");
            }
            else
                if(n==3)
                {
                    int year1 = input.nextInt();
                    int month1 = input.nextInt();
                    int day1 = input.nextInt();
                    DateUtil date1=new DateUtil(year1,month1,day1);
                    int year2 = input.nextInt();
                    int month2 = input.nextInt();
                    int day2 = input.nextInt();
                    DateUtil date2=new DateUtil(year2,month2,day2);
                    if(date1.validate1()&&date2.validate1())
                    {
                        date1.sub(date1,date2);
                    }
                    else
                        System.out.println("Wrong Format");
                }
                else
                    System.out.println("Wrong Format");
    }
}
class DateUtil{
    Year year;
    Month month;
    Day day;
    int cnt=0;
    public DateUtil(){
    }
    public DateUtil(int d,int m,int y){
        this.day=new Day(d,m,y);
    }
    public boolean validate1(){
        if(day.validate())
        {
            return true;
        }
        else {
            return false;
        }
    }
    public void format(int n)//前n天
    {
        int y = day.getMonth().getYear().getValue();
        int m = day.getMonth().getValue();
        int d = day.getValue();
        int nd=n;
            for(;n!=0;n--)
            {
                cnt++;
                if(m==5||m==7||m==10||m==12)
                {
                    if(d==1)
                    {
                        m--;
                        d=30;
                    }
                    else
                    {
                        d--;
                    }
                }
                else
                if(m==8)
                {
                    if(d==1)
                    {
                        m--;
                        d=31;
                    }
                    else
                    {
                        d--;
                    }
                }
                else
                if(m==1)
                {
                    if(d==1)
                    {
                        y--;
                        m=12;
                        d=31;
                    }
                    else
                    {
                        d--;
                    }
                }
                else
                if(m==3)
                {
                    if(d==1)
                    {
                        if((y%4==0&&y%100!=0)||y%400==0)
                        {
                            m--;
                            d=29;
                        }
                        else
                        if(!((y%4==0&&y%100!=0)||y%400==0))
                        {
                            m--;
                            d=28;
                        }
                    }
                    else
                    {
                        d--;
                    }
                }
                else
                {
                    if(d==1)
                    {
                        m--;
                        d=31;
                    }
                    else
                    {
                        d--;
                    }
                }
            }
        System.out.print( y + "-" + m + "-" + d);
    }
    public void after(int n)//后n天
    {
        int y = day.getMonth().getYear().getValue();
        int m = day.getMonth().getValue();
        int d = day.getValue();
        int nd=n;
        if(n>0)
        {
            for(;n!=0;n--)
            {
                cnt++;
                if(m==1||m==3||m==5||m==8||m==10)
                {
                    if(d==31)
                    {
                        m++;
                        d=1;
                    }
                    else
                    {
                        d++;
                    }
                }
                else
                if(m==12)
                {
                    if(d==31)
                    {
                        y++;
                        m=1;
                        d=1;
                    }
                    else
                    {
                        d++;
                    }
                }
                else
                if(m==2)
                {
                    if((y%4==0&&y%100!=0)||y%400==0)
                    {
                        if(d==29)
                        {
                            m++;
                            d=1;
                        }
                        else
                        {
                            d++;
                        }
                    }
                    else
                    if(!((y%4==0&&y%100!=0)||y%400==0))
                    {
                        if(d==28)
                        {
                            m++;
                            d=1;
                        }
                        else
                        {
                            d++;
                        }
                    }
                }
                else
                if(m==7)
                {
                    if(d==31)
                    {
                        m++;
                        d=1;
                    }
                    else
                    {
                        d++;
                    }
                }
                else
                {
                    if(d==30)
                    {
                        m++;
                        d=1;
                    }
                    else
                    {
                        d++;
                    }
                }
            }
        }
        System.out.print( y + "-" + m + "-" + d);
    }
    public void sub(DateUtil date1,DateUtil date2)//相差n天
    {
        int date1y=date1.day.getMonth().getYear().getValue();
        int date1m=date1.day.getMonth().getValue();
        int date1d=date1.day.getValue();
        int date2y=date2.day.getMonth().getYear().getValue();
        int date2m=date2.day.getMonth().getValue();
        int date2d=date2.day.getValue();
        int y=0,m=0,d=0,y2=0,m2=0,d2=0;
        if(date1y>date2y||date1y==date2y&&date1m>date2m||date1y==date2y&&date1m==date2m&&date1d>date2d)
        {
            y=date2y;
            m=date2m;
            d=date2d;
            y2=date1y;
            m2=date1m;
            d2=date1d;
        }
        else
            {
                y=date1y;
                m=date1m;
                d=date1d;
                y2=date2y;
                m2=date2m;
                d2=date2d;
            }
        int n=0;
            for(n=0;!(y==y2&&m==m2&&d==d2);n++)
            {
                if(m==1||m==3||m==5||m==8||m==10)
                {
                    if(d==31)
                    {
                        m++;
                        d=1;
                    }
                    else
                    {
                        d++;
                    }
                }
                else
                if(m==12)
                {
                    if(d==31)
                    {
                        y++;
                        m=1;
                        d=1;
                    }
                    else
                    {
                        d++;
                    }
                }
                else
                if(m==2)
                {
                    if((y%4==0&&y%100!=0)||y%400==0)
                    {
                        if(d==29)
                        {
                            m++;
                            d=1;
                        }
                        else
                        {
                            d++;
                        }
                    }
                    else
                    if(!((y%4==0&&y%100!=0)||y%400==0))
                    {
                        if(d==28)
                        {
                            m++;
                            d=1;
                        }
                        else
                        {
                            d++;
                        }
                    }
                }
                else
                if(m==7)
                {
                    if(d==31)
                    {
                        m++;
                        d=1;
                    }
                    else
                    {
                        d++;
                    }
                }
                else
                {
                    if(d==30)
                    {
                        m++;
                        d=1;
                    }
                    else
                    {
                        d++;
                    }
                }
            }
            System.out.println(n);
    }
}

class Year{
    int value;
    public Year() {
    }
    public Year(int value) {
        this.value = value;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public boolean isLeapYear()
    {
        if((value%4==0&&value%100!=0)||value%400==0)
            return true;
        else
            return false;
    }

    public boolean validate() {
        if(value>=1900&&value<=2050)
            return true;
        else
            return false;
    }
}
class Day{
    int value;
    Month month;
    public Day() {
    }
    public Day(int yearValue,int monthValue,int dayValue) {
        month = new Month(yearValue,monthValue);
        value = dayValue;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public Month getMonth() {
        return month;
    }
    public void setMonth(Month value) {
        this.month = value;
    }
    public boolean validate() {
        int y=getMonth().getYear().getValue();
        int m=getMonth().getValue();
        int d=getValue();
        if(y>=1900&&y<=2050&&m>=1&&m<=12&&d>=1&&d<=31)
        {
            if(!((y%4==0&&y%100!=0)||y%400==0))
            {
                if(m==2&&d>=29)
                {
                    return false;
                }
            }
            if((y%4==0&&y%100!=0)||y%400==0)
            {
                if(m==2&&d>=30)
                {
                    return false;
                }
            }
            if(m==2||m==4||m==6||m==9||m==11)
                if(d>=31)
                {
                    return false;
                }
                else
                if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
                    if(d>=32)
                    {
                        return false;
                    }
            return true;
        }
        else
            return false;
    }
}

class Month{
    int value;
    Year year;
    public Month() {
    }
    public Month(int yearValue,int monthValue) {
        year = new Year(yearValue);
        value = monthValue;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public Year getYear() {
        return year;
    }
    public void setYear(Year year) {
        this.year = year;
    }
    public void resetMin() {
        value=1;
    }
    public void resetMax() {
        value=12;
    }
    public boolean validate() {
        if(value>=1&&value<=12)
            return true;
        else
            return false;
    }
}

 

 

 

聚合2代码如下:

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n= input.nextInt();
        if(n==1)
        {
            int year = input.nextInt();
            int month = input.nextInt();
            int day = input.nextInt();
            DateUtil w=new DateUtil(year,month,day);
            int d= input.nextInt();
            if(w.validate())
            {
                w.after(d);
            }
            else
                System.out.println("Wrong Format");
        }
        else
        if(n==2)
        {
            int year = input.nextInt();
            int month = input.nextInt();
            int day = input.nextInt();
            DateUtil w=new DateUtil(year,month,day);
            int d= input.nextInt();
            if(w.validate())
            {
                w.format(d);
            }
            else
                System.out.println("Wrong Format");
        }
        else
        if(n==3)
        {
            int year1 = input.nextInt();
            int month1 = input.nextInt();
            int day1 = input.nextInt();
            DateUtil date1=new DateUtil(year1,month1,day1);
            int year2 = input.nextInt();
            int month2 = input.nextInt();
            int day2 = input.nextInt();
            DateUtil date2=new DateUtil(year2,month2,day2);
            if(date1.validate()&&date2.validate())
            {
                date1.sub(date1,date2);
            }
            else
                System.out.println("Wrong Format");
        }
        else
            System.out.println("Wrong Format");
    }
    }
class Month{
    int value;
    public Month() {
    }
    public Month(int monthValue) {
        value = monthValue;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public boolean validate() {
        if(value>=1&&value<=12)
            return true;
        else
            return false;
    }
}
class Year{
    int value;
    public Year() {
    }
    public Year(int value) {
        this.value = value;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public boolean validate() {
        if(value>=1820&&value<=2020)
            return true;
        else
            return false;
    }
    public boolean isLeapYear()
    {
        if((value%4==0&&value%100!=0)||value%400==0)
            return true;
        else
            return false;
    }
}

class Day{
    int value;
    public Day() {
    }
    public Day(int dayValue) {
        value = dayValue;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
}
class DateUtil{
    Year year;
    Month month;
    Day day;
    int cnt=0;
    int y,m,d,y2,m2,d2;
    public DateUtil(){
    }
    public void setYear(Year year) {
        this.year = year;
    }
    public Year getYear() {
        return year;
    }
    public void setMonth(Month month) {
        this.month = month;
    }
    public Month getMonth() {
        return month;
    }
    public void setDay(Day day) {
        this.day = day;
    }
    public Day getDay() {
        return day;
    }
    public DateUtil(int y,int m,int d){
        this.year=new Year(y);
        this.month=new Month(m);
        this.day=new Day(d);
    }
    public boolean validate(){
        int y=getYear().value;
        int m= getMonth().value;
        int d= getDay().value;
        if(!(y>=1820&&y<=2020)&&!(m>=1&&m<=12)&&!(d>=1&&d<=31))
        {
            return false;
        }
        if(y>=1820&&y<=2020&&m>=1&&m<=12&&d>=1&&d<=31)
        {
            if(!((y%4==0&&y%100!=0)||y%400==0))
            {
                if(m==2&&d>=29)
                {
                    return false;
                }
            }
            if((y%4==0&&y%100!=0)||y%400==0)
            {
                if(m==2&&d>=30)
                {
                    return false;
                }
            }
            if(m==2||m==4||m==6||m==9||m==11)
                if(d>=31)
                {
                    return false;
                }
                else
                if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
                    if(d>=32)
                    {
                        return false;
                    }
            return true;
        }
        else
            return false;
    }
    public void after(int n)//后n天
    {
        long y=getYear().value;
        long m= getMonth().value;
        long d= getDay().value;
        int nd=n;
        if(n>0)
        {
            for(;n!=0;n--)
            {
              
                if(m==1||m==3||m==5||m==8||m==10)
                {
                    if(d==31)
                    {
                        m++;
                        d=1;
                    }
                    else
                    {
                        d++;
                    }
                }
                else
                if(m==12)
                {
                    if(d==31)
                    {
                        y++;
                        m=1;
                        d=1;
                    }
                    else
                    {
                        d++;
                    }
                }
                else
                if(m==2)
                {
                    if((y%4==0&&y%100!=0)||y%400==0)
                    {
                        if(d==29)
                        {
                            m++;
                            d=1;
                        }
                        else
                        {
                            d++;
                        }
                    }
                    else
                    if(!((y%4==0&&y%100!=0)||y%400==0))
                    {
                        if(d==28)
                        {
                            m++;
                            d=1;
                        }
                        else
                        {
                            d++;
                        }
                    }
                }
                else
                if(m==7)
                {
                    if(d==31)
                    {
                        m++;
                        d=1;
                    }
                    else
                    {
                        d++;
                    }
                }
                else
                {
                    if(d==30)
                    {
                        m++;
                        d=1;
                    }
                    else
                    {
                        d++;
                    }
                }
            }
        }
        System.out.print(getYear().value+"-"+getMonth().value+"-"+getDay().value+" next "+nd+" days is:"+ y + "-" + m + "-" + d);
    }

    public void format(int n)//前n天
    {
        long y=getYear().value;
        long m= getMonth().value;
        long d= getDay().value;
        int nd=n;
        for(;n!=0;n--)
        {
            cnt++;
            if(m==5||m==7||m==10||m==12)
            {
                if(d==1)
                {
                    m--;
                    d=30;
                }
                else
                {
                    d--;
                }
            }
            else
            if(m==8)
            {
                if(d==1)
                {
                    m--;
                    d=31;
                }
                else
                {
                    d--;
                }
            }
            else
            if(m==1)
            {
                if(d==1)
                {
                    y--;
                    m=12;
                    d=31;
                }
                else
                {
                    d--;
                }
            }
            else
            if(m==3)
            {
                if(d==1)
                {
                    if((y%4==0&&y%100!=0)||y%400==0)
                    {
                        m--;
                        d=29;
                    }
                    else
                    if(!((y%4==0&&y%100!=0)||y%400==0))
                    {
                        m--;
                        d=28;
                    }
                }
                else
                {
                    d--;
                }
            }
            else
            {
                if(d==1)
                {
                    m--;
                    d=31;
                }
                else
                {
                    d--;
                }
            }
        }
        System.out.print(getYear().value+"-"+getMonth().value+"-"+getDay().value+" previous "+nd+" days is:"+ y + "-" + m + "-" + d);
    }
    public void define(DateUtil date1,DateUtil date2)
    {
        int date1y=date1.getYear().value;
        int date1m=date1.getMonth().getValue();
        int date1d=date1.getDay().getValue();
        int date2y=date2.getYear().value;
        int date2m=date2.getMonth().getValue();
        int date2d=date2.getDay().value;
        if(date1y>date2y||date1y==date2y&&date1m>date2m||date1y==date2y&&date1m==date2m&&date1d>date2d)
        {
            y=date2y;
            m=date2m;
            d=date2d;
            y2=date1y;
            m2=date1m;
            d2=date1d;
        }
        else
        {
            y=date1y;
            m=date1m;
            d=date1d;
            y2=date2y;
            m2=date2m;
            d2=date2d;
        }
    }
    
    public void sub(DateUtil date1,DateUtil date2)//相差n天
    {
        define(date1,date2);
        long date1y=date1.getYear().value;
        long date1m=date1.getMonth().getValue();
        long date1d=date1.getDay().getValue();
        long date2y=date2.getYear().value;
        long date2m=date2.getMonth().getValue();
        long date2d=date2.getDay().value;
        int n=0;
        for(n=0;!(y==y2&&m==m2&&d==d2);n++)
        {
            if(m==1||m==3||m==5||m==8||m==10)
            {
                if(d==31)
                {
                    m++;
                    d=1;
                }
                else
                {
                    d++;
                }
            }
            else
            if(m==12)
            {
                if(d==31)
                {
                    y++;
                    m=1;
                    d=1;
                }
                else
                {
                    d++;
                }
            }
            else
            if(m==2)
            {
                if((y%4==0&&y%100!=0)||y%400==0)
                {
                    if(d==29)
                    {
                        m++;
                        d=1;
                    }
                    else
                    {
                        d++;
                    }
                }
                else
                if(!((y%4==0&&y%100!=0)||y%400==0))
                {
                    if(d==28)
                    {
                        m++;
                        d=1;
                    }
                    else
                    {
                        d++;
                    }
                }
            }
            else
            if(m==7)
            {
                if(d==31)
                {
                    m++;
                    d=1;
                }
                else
                {
                    d++;
                }
            }
            else
            {
                if(d==30)
                {
                    m++;
                    d=1;
                }
                else
                {
                    d++;
                }
            }
        }
        System.out.println("The days between "+date1y+"-"+date1m+"-"+date1d+" and "+date2y+"-"+date2m+"-"+date2d+" are:"+n);
    }
}

 

2、题目集4(7-3)与题目集6(7-57-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)

题目集4(7-3)类图(以下称为题目7-3)

 

题目集6(7-5)类图(以下我们称为题目7-5)

 

题目集6(7-6)类图(以下我们称为题目7-6)

 

  • 题目7-3单纯为继承题,题目7-5为图形继承与多态,题目7-6为实现图形多态与接口。(1)在题目7-3中,Shape为总的父类,CircleRectangle为其子类;接下来的BallBox分别为CircleRectangle的子类。其中Shape为图形的形状、CircleRectangle分别为圆形和矩形。Shape,无属性,有一个返回0.0的求图形面积的公有方法类Circle,继承自Shape,有一个私有实型的属性radius(半径),重写父类继承来的求面积方法,求圆的面积类Rectangle,继承自Shape,有两个私有实型属性width和length,重写父类继承来的求面积方法,求矩形的面积类Ball,继承自Circle,其属性从父类继承,重写父类求面积方法,求球表面积,此外,定义一求球体积的方法类Box,继承自Rectangle,除从父类继承的属性外,再定义一个属性height,重写父类继承来的求面积方法,求立方体表面积,此外,还有一个求立方体体积的方法     (2)在题目7-5中,题目目的主要要我们掌握类的继承、多态性及其使用方法本次作业重点研究平面图形相关的处理方法。类图中的getArea()方法为抽象方法,功能为求得图形的面积;validate()方法也为抽象方法,对图形的属 性进行合法性校验;toString()继承自 Object,功能为输出图形的面积信息。所谓的“多态”,简单的理解就是对象在不同情况下的不同表现,具体体现在定义和功能两个方 面,简单的总结一下,多态可以用“三个定义和两个方法”来总结。三个定义分别是父类定义子类构 建、接口定义实现类构建和抽象类定义实体类构建,而两个方法分别是方法重载和方法重写。本次作 业我们采用的是抽象类定义、实体类构建的方式。即 Shape为抽象类,Circle、Rectangle 及 Triangle 为实体类。此外,题目要求我们根据图形的面积大小进行升序排序,要求必须对list中的图形对象list中进行排序,而不是对求得的面积进行排序,排序后再次求出各图形的面积并输出,ArrayList的应用:要求创建的各个图形对象均存储在 ArrayList类型的列表中(具体使用方法在下面的代码中可见)。     (3)在题目7-6中GetArea为一个接口,无属性,只有一个GetArea(求面积)的抽象方法;Circle及Rectangle分别为圆类及矩形类,分别实现GetArea接口要求:在Main类的主方法中分别定义一个圆类对象及矩形类对象(其属性值由键盘输入),使用接口的引用分别调用圆类对象及矩形类对象的求面积的方法,直接输出两个图形的面积值。
  • 题目7-3代码如下:
  • public class Main {
         public static void main(String[] args) {
              java.util.Scanner input = new java.util.Scanner(System.in);
              int size = input.nextInt();
              int[] list = new int[size];
              for (int i = 0; i < list.length; i++) {
                  list[i] = input.nextInt();
              }
    
              int choice  = input.nextInt();
    
              switch(choice){
              case 1:insertionSort(list);break;
              case 2:selectionSort(list);break;
              case 3:bubbleSort(list);break;
              default: break;
              }
          }
          
        private static void selectionSort(int[] list) {
            // TODO Auto-generated method stub
              int min ;//记录目前能找到的最小值元素的下标
              for (int i = 0; i < list.length - 1; i++){ //总共要经过list.length-1轮比较 
                    min = i;
                    for (int j = i+1 ; j < list.length; j++) {  //每一趟在后面的n-i+1个待排序的元素中选择关键字最小的元素
                        if (list[min]>list[j])  {
                            min=j;
                           
                        }
                    if(i != min) {//将找到的最小值和i位置所在的值进行交换
                    int temp = list[i];
                    list[i] = list[min];
                    list[min] = temp;
                    }
                  }
              }
                    for( int i=0;i<list.length;i++) 
                        System.out.print(list[i]+" ");
                }
              
          
    
                    
        //Insert your code
         
    
    private static void insertionSort(int[] list) {
        // TODO Auto-generated method stub
        int j;
        for(int i= 1;i<list.length;i++) {//从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
            int tmp = list[i];//记录要插入的数据
            j=i;
            while(j > 0 && tmp < list[j-1]){//从已经排序的序列最右边的开始比较,找到比其小的数
                list[j] = list[j-1];//向后挪动
                j--;
            }
            list[j] = tmp;//存在比其小的数,插入
        }
        for(int i = 0 ; i < list.length ; i++){
            System.out.print(list[i]+" ");
            }
    }
    
    public static void bubbleSort(int[] list) {
        // TODO Auto-generated method stub
         int j = 0;
          int tmp = 0;
          for(int i=0;i<list.length-1;i++) {//确定排序趟数
          for(j=0;j<list.length-i-1;j++) {//确定比较次数
              if(list[j]>list[j+1]) {
                  //交换
                  tmp = list[j+1];
                  list[j+1] = list[j];
                  list[j] = tmp;
              }
          }
          }
          for(int i=0;i<list.length;i++) 
            System.out.print(list[i]+" ");
    
    }
    
    
    
    
    }

     

  • 题目7-5代码如下:
  • import java.util.Scanner;
    import java.util.ArrayList;
    import java.util.*;
    public class Main{
        public static void main(String[] args) {
           Scanner input = new Scanner(System.in);
           int a=input.nextInt();
           int b=input.nextInt();
           int c=input.nextInt();
            ArrayList<Shape> w=new ArrayList<>();
            int i=0,j=0,judge=1;
            double sum=0;
                for (i = 0; i < a; i++) {
                    double radius = input.nextDouble();
                    w.add(new C(radius));
                    if(w.get(i).validate())
                    {
                    }
                    else
                        judge=0;
                }
                for (i = 0; i < b; i++) {
                    double width = input.nextDouble();
                    double length = input.nextDouble();
                    w.add(new R(width, length));
                }
                for (i = 0; i < c; i++) {
                    double side1 = input.nextDouble();
                    double side2 = input.nextDouble();
                    double side3 = input.nextDouble();
                    w.add(new Triangle(side1, side2, side3));
                }
                for (i = 0; i < a + b + c; i++) {
                    if (w.get(i).validate())
                    {
                    }
                    else
                        {
                        judge = 0;
                    }
                }
            
            if(a==0&&b==0&&c==0)
            {
                judge=1;
            }
           
                if (judge == 1 && (a >= 0 && b >= 0 && c >= 0)) {
                    System.out.println("Original area:");
                    for (i = 0; i < a; i++) {
                        System.out.print(String.format("%.2f", w.get(i).getArea()) + " ");
                    }
                    for (i = a; i < a + b; i++) {
                        System.out.print(String.format("%.2f", w.get(i).getArea()) + " ");
                    }
                    for (i = a + b; i < a + b + c; i++) {
                        System.out.print(String.format("%.2f", w.get(i).getArea()) + " ");
                    }
                    System.out.println();
                    for (i = 0; i < a + b + c; i++) {
                        sum += w.get(i).getArea();
                    }
                    System.out.println("Sum of area:" + String.format("%.2f", sum));
                    sort(w);
                    System.out.println("Sorted area:");
                    for (i = 0; i < a + b + c; i++) {
                        System.out.print(String.format("%.2f", w.get(i).getArea()) + " ");
                    }
                    System.out.println();
                    sum=0;
                    for (i = 0; i < a + b + c; i++) {
                        sum += w.get(i).getArea();
                    }
                    System.out.println("Sum of area:" + String.format("%.2f", sum));
                } else {
                    System.out.println("Wrong Format");
                }
                
        }
        public static ArrayList<Shape> sort(ArrayList<Shape> w){
            Shape k;
            int i=0,j=0;
            double a=0,b=0,t=0;
                for (i = 0; i < w.size(); i++) {
                    for (j = 0; j < w.size() - i - 1; j++) {
                        if (w.get(j).getArea() >= w.get(j + 1).getArea()) {
                            k = w.get(j);
                            w.set(j, w.get(j + 1));
                            w.set(j + 1, k);
                        }
                    }
                }
            
            return w;
        }
    }
    
    class C extends Shape{
        @Override
        public double getArea(){
            return Math.PI*radius*radius;
        }
        Shape shape;
        C(){
        }
        double radius;
        C(double radius)
        {
            this.radius=radius;
        }
        @Override
        public boolean validate(){
            if(radius>0)
                return true;
            else
                return false;
        }
    }
    
    class R extends Shape{
        R(){
        }
        double width;
        double length;
        Shape shape;
        R(double width,double length)
        {
            this.width=width;
            this.length=length;
        }
        @Override
        public boolean validate(){
            if(width>0&&length>0)
                return true;
            else
                return false;
        }
        @Override
        public double getArea(){
            return width*length;
        }
    }
    
    class Triangle extends Shape{
         double side1;
         double side2;
         double side3;
        Shape shape;
        Triangle(){
        }
        @Override
        public boolean validate()
        {
            if(side1+side2<=side3||side1+side3<=side2||side2+side3<=side1)
            {
                return false;
            }
            if(side1-side2>=side3||side1-side3>=side2||side2-side3>=side1)
            {
                return false;
            }
            return true;
        }
        Triangle(double side1,double side2,double side3)
        {
            this.side1=side1;
            this.side2=side2;
            this.side3=side3;
        }
        @Override
        public double getArea(){
            double p=(side1+side2+side3)/2;
            double s=Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
            return s;
        }
    }
    
    abstract class Shape{
        abstract public double getArea();
        abstract public boolean validate();
        Shape(){
        }
    }

     

  • 题目7-6代码如下:
  • import java.util.Scanner;
    import java.util.*;
    public class Main {
        public static void main(String[] args){
            Scanner input=new Scanner(System.in);
               double r = input.nextDouble();
               double width = input.nextDouble();
               double length = input.nextDouble();
                if (r <= 0 || width <= 0 || length <= 0)
                {
                    System.out.println("Wrong Format");
                }
                else
                    {
                        
                        Circle a = new Circle(r);
                        Rectangle b = new Rectangle(width, length);
                        double s1 = a.getArea();//圆面积
                        double s2 = b.getArea();//矩形面积
                        System.out.println(String.format("%.2f", s1));
                        System.out.println(String.format("%.2f", s2));
                    }
           
        }
    }
    interface GetArea{
        double getArea();
    }
    
    class Circle implements GetArea{
        Circle(){
        }
        double radius;
        Circle(double radius){
            this.radius=radius;
        }
        public void setRadius(double radius) {
            this.radius = radius;
        }
        public double getRadius() {
            return radius;
        }
        @Override
        public double getArea() {
            double s;
            s=Math.PI*radius*radius;
            return s;
        }
        
    }
    
    class Rectangle implements GetArea{
        Rectangle(){
        }
        double width;
        double length;
        Rectangle(double width,double length){
            this.width=width;
            this.length=length;
        }
        public void setWidth(double width) {
            this.width = width;
        }
        public double getWidth() {
            return width;
        }
        public void setLength(double length) {
            this.length = length;
        }
        public double getLength() {
            return length;
        }
        @Override
        public double getArea() {
            double s;
            s=width*length;
            return s;
        }
    }

     

3、三次题目集中的正则表达式总结:

题目集4中正则表达式的运用在分值为五十分的题目7-1中,题目为水文校验及数据处理,其中题目要求:对输入数据合法性校验必须使用正则表达式;因为该题难度较大,所以在此不做具体分析。指导书给出的类图如下:

 

类间发送消息如图:

题目集6中的正则表达式运用于题目7-4(学号校验)。题目要求为:

对软件学院2020级同学学号进行校验,学号共八位,规则如下:

  • 1、2位:入学年份后两位,例如20年
  • 3、4位:学院代码,软件学院代码为20
  • 5位:方向代码,例如1为软件工程,7为物联网
  • 6位:班级序号
  • 7、8位:学号(序号)

要求如下:

  • 只针对2020级
  • 其中软件工程专业班级分别为:202011~17、61,物联网工程专业班级为202071~202073,数据科学与大数据专业班级为202081~82
  • 每个班级学号后两位为01~40

代码中的具体运用为:String regex = "^2020(1[1-7]|61|7[1-3]|8[1-2])(0[1-9]|[1-3]\\d|40)";

7-4代码如下:

 

import java.util.Scanner;
public class Main{

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        String str = input.nextLine();
        String regex = "^2020(1[1-7]|61|7[1-3]|8[1-2])(0[1-9]|[1-3]\\d|40)";
        int length = str.length();
        boolean n = str.matches(regex);
        if(length == 8) {
            if(n)
                System.out.print("正确");
            else
                System.out.print("错误");
            
        }
        else
            System.out.print("错误");
        
        
    }

}

 

 

 

4、题目集5(7-5)中Java集合框架应用的分析总结:因为个人pta的完成情况,在此此题目不做具体分析。

踩坑心得:经过同学们的反馈之后,从题目集5开始基础题型开始变多,这对我们学习Java语言是有极大帮助的,但是在我们的学习过程中肯定都会存在问题,在此就个人的学习针对每个题目集都在此做一个总结。   题目集4:首先是题目7-2(日期聚合一),这一题完整的做完,当然包括过pta上的测试点,花了的时间算很长了,题目中给的类图确实有些复杂,当初理解也理解了半天,还有计算日期相差的天数也是最后才挣扎出来,时间久了,挣扎的细节我也不多说了,总之这题还是挺让人头疼的;然后是题目7-3(图形继承),刚开始接触继承,是真的很难理解,上课老师讲也迷迷糊糊的听不懂,这着实让人着急,但其实在学习过程中我们会发现,其实在一个题目中,我们就可以学到所有东西,在写一个题目的过程中,不懂继承我们会想尽办法去找到解决问题的方法,充分利用互联网资源才是最明智的选择。    题目集5:在这个题目集里面其实印象最深的还是题目7-3(对整型数据进行排序),刚开始看题目的时候有些不明白为什么非要用三种方法,用一种最简单的冒泡排序的方法不一样能简简单单得出答案吗?做了这个题目才发现三种排序方法(插入排序、选择排序、冒泡排序)各有各的好处,其中的插入排序是我之前没有用过的方法,在此题目中也学会了如何使用。   题目集6:此题目集中印象最深的要数“多态”和“接口”的使用了。说实话,多态和接口刚开始理解和使用着实有些困难,直至现在也不算懂的很透彻,不过我会努力去理解它们。

改进建议:虽然在Java的学习上花的时间不少,但是我觉得自己应该再花些时间去不断地完善自己的代码,争取每次pta上的作业拿下一百分。即使拿了一百分,也要不断地检查和思考自己的代码,写出做好的解决问题的方案,从而达到不断优化自己代码的目的。

总结:我们学习Java语言已经有大半个学期了,这么久的学习下来,我个人的体验还是觉得Java还是比较难学的语言的。这样相比之下,会觉得上学期学的C语言简单很多吧。但是可能后期学了别语言之后,我们也可能会觉得Java没有自己想象中的那么难了吧。本次学习还是学到了挺多东西的,正则表达式的运用、聚合、继承、多态、接口.......这些都是Java语言的特点,其中继承、多态和接口还要继续学习,从而加深进一步的理解。