PTA题目集4-6的总结与归纳

PTA题目集4-6的总结与归纳

 

  前言:

      4-6的题目知识点涵盖广泛,灵活性很高,大部分题目综合性较强,难度也相对较大。

      这里做点简单的归纳整理,同各位一起学习进步。

  目录:

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

 

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

 

        ③对三次题目集中用到的正则表达式技术的分析总结

 

        ④题目集5(7-4)中Java集合框架应用的分析总结

 

 

一:两种日期类聚合设计的优劣比较

7-2 日期问题面向对象设计(聚合一) 

设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

7-5 日期问题面向对象设计(聚合二) (40 分)
 

设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

 

 

 

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

有三种输入方式(以输入的第一个数字划分[1,3]):

  • 1 year month day n //测试输入日期的下n天
  • 2 year month day n //测试输入日期的前n天
  • 3 year1 month1 day1 year2 month2 day2 //测试两个日期之间相差的天数

 

可以看出这两个题相似度极其的高,UML类图只是有了些许的差异,功能和输入上没有做变化。

先就我的一些看法分享如下:

1.聚合二就聚合一上将求下一年/月/日及上一年/月/日的功能封装在了每个各自的类里,结构上做的更加的清晰

2.聚合一的聚合连接是链式连接,一环扣一环,不能跨越调用,聚合二以dataUtil工具类作为连接体,以自身为中心,创建Year,Month,Day三个对象,便于理解也更加方便调用,更能体现高聚合,低耦合的性质。

聚合一Main类:

 1 public class Main{
 2     public static void main(String[] args){
 3         Scanner input=new Scanner(System.in);
 4         int c=input.nextInt();
 5 
 6         DateUtil dateUtil=new DateUtil();
 7 
 8         switch (c){
 9             case 1:{
10                 dateUtil.year= input.nextInt();
11                 dateUtil.month= input.nextInt();
12                 dateUtil.day= input.nextInt();
13                 dateUtil.setter(dateUtil.year, dateUtil.month, dateUtil.day);
14                 int n= input.nextInt();
15 
16                 if(dateUtil.checkInputValidity(dateUtil.year, dateUtil.month, dateUtil.day)){
17                     dateUtil.getNextNDays(n);
18                     System.out.println(dateUtil.year+"-"+ dateUtil.month+"-"+ dateUtil.day);
19                 }
20              
21 
22 
23                     break;
24             }
25             case 2:
26             case 3:
27             default:
28                 System.out.println("Wrong Format");
29 
30         }
31 }
32 }

 聚合二Main类:

 1 public class Main {
 2     public static void main(String[] args){
 3         Scanner input=new Scanner(System.in);
 4         DateUtil dateUtil=new DateUtil();
 5         int choose= input.nextInt();
 6         int year=input.nextInt();
 7         int month=input.nextInt();
 8         int day= input.nextInt();
 9         dateUtil.setAll(year,month,day);
10         if(dateUtil.checkInputValidity(year,month,day)) {
11             switch (choose){
12                 case 1:{
13                     int n= input.nextInt();
14                     dateUtil.getNextNDay(n);
15                     System.out.println(year+"-"+month+"-"+day+" next " +n+" days is:"+dateUtil.getYear()+"-"+ dateUtil.getMonth()+"-"+dateUtil.getDay());
16                     break;
17 
18                 }
19                 case 2:{
20                     int n= input.nextInt();
21                     dateUtil.getBeforeNDay(n);
22                     System.out.println(year+"-"+month+"-"+day+" previous " +n+" days is:"+dateUtil.getYear()+"-"+ dateUtil.getMonth()+"-"+dateUtil.getDay());
23                 }break;
24                 case 3:{
25                     int toYear= input.nextInt();
26                     int toMonth= input.nextInt();
27                     int toDay= input.nextInt();
28                     if (dateUtil.checkInputValidity(toYear,toMonth,toDay)){
29                         if(year>toYear||(year==toYear&&month>toMonth)||(year==toYear&&month==toMonth&&day>toDay))
30                         {
31                             dateUtil.getGapDays(toYear,toMonth,toDay,year,month,day);
32                                System.out.println("The days between "+year+"-"+ month+"-"+ day+" and "+toYear+"-"+toMonth+"-"+toDay+" are:"+dateUtil.getGapDays(toYear,toMonth,toDay,year,month,day));
33                         }
34                         else{
35                             dateUtil.getGapDays(year,month,day,toYear,toMonth,toDay);
36                             System.out.println("The days between "+year+"-"+month+"-"+day+" and "+toYear+"-"+toMonth+"-"+toDay+" are:"+dateUtil.getGapDays(year,month,day,toYear,toMonth,toDay));
37 
38                         }
39                         //System.out.println("The days between "+year+"-"+month+"-"+day+" and "+toYear+"-"+toMonth+"-"+toDay+" are:"+dateUtil.getGapDays(year,month,day,toYear,toMonth,toDay));
40                         //}
41                         }
42 
43                 }break;
44                 default:
45                     System.out.println("Wrong Format");
46             }
47             
48         }else 
49      System.out.println("Wrong Format");
50     }
51 }

 

可以看出,在Main类里两个结构也是大致差不多的,对象的调用,判断条件,输出格式,看起来较为冗杂,可以将输出封装在dataUtil里,进行调用就不会使主类显得复杂难看了。

这里我把当时我的难点分享在此:也就是计算两个日期的相差时间。

其实想想它并不难,可以理解为从一个日期小的时间开始一直往后加一天,用一个变量记录循环的次数,循环到日起大的日期就停下来,这样也就得到了循环的次数也就是相差的天数了。不过这样的一次一次的循环,执行效率可能并没有多好,但是老方法往往也是浅显易懂的,也正适合我这种初学的小白,理解起来就很轻松。往后学到了更多的内容后可以根据自身的情况来更改优化之前写过的代码,条条大路通罗马,方法多种多样总有弯路和捷径,我们也是在路上不断的探索和进步。

相差天数方法如下:

 /**俩日期相差天数*/
    int getGapDays(int year,int month,int day,int toYear,int toMonth,int toDay){
        int flag=0;
        while(true){
            switch (month){
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:{
                    if (day+1<=31){
                        day=day+1;
                    }
                    else{
                        month+=1;
                        day=1;
                    }
                    break;
                }
                case 12:{
                    if (day+1<=31){
                        day=day+1;
                    }
                    else{
                        year+=1;
                        month=1;
                        day=1;
                    }
                    break;
                }
                case 4:
                case 6:
                case 9:
                case 11:{
                    if (day+1<=30){
                        day=day+1;
                    }
                    else{
                        month+=1;
                        day=1;
                    }
                    break;
                }
                case 2:{
                    if(isLeapYear(year)){
                        if(day+1<=29){
                            day+=1;
                        }
                        else{
                            day=1;
                            month+=1;
                        }
                    }
                    else{
                        if(day+1<=28){
                            day+=1;
                        }
                        else{
                            day=1;
                            month+=1;
                        }
                    }
                    break;
                }
            }
            flag++;
            if(year==toYear&&month==toMonth&&day==toDay){
                break;
            }
}
        return flag;
}
    }

  

二:三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)

7-3 图形继承 (15 分)

编写程序,实现图形类的继承,并定义相应类对象并进行测试。

  1. 类Shape,无属性,有一个返回0.0的求图形面积的公有方法public double getArea();//求图形面积
  2. 类Circle,继承自Shape,有一个私有实型的属性radius(半径),重写父类继承来的求面积方法,求圆的面积
  3. 类Rectangle,继承自Shape,有两个私有实型属性width和length,重写父类继承来的求面积方法,求矩形的面积
  4. 类Ball,继承自Circle,其属性从父类继承,重写父类求面积方法,求球表面积,此外,定义一求球体积的方法public double getVolume();//求球体积
  5. 类Box,继承自Rectangle,除从父类继承的属性外,再定义一个属性height,重写父类继承来的求面积方法,求立方体表面积,此外,定义一求立方体体积的方法public double getVolume();//求立方体体积
  6. 注意:
  • 每个类均有构造方法,且构造方法内必须输出如下内容:Constructing 类名
  • 每个类属性均为私有,且必须有getter和setter方法(可用Eclipse自动生成)
  • 输出的数值均保留两位小数

主方法内,主要实现四个功能(1-4): 从键盘输入1,则定义圆类,从键盘输入圆的半径后,主要输出圆的面积; 从键盘输入2,则定义矩形类,从键盘输入矩形的宽和长后,主要输出矩形的面积; 从键盘输入3,则定义球类,从键盘输入球的半径后,主要输出球的表面积和体积; 从键盘输入4,则定义立方体类,从键盘输入立方体的宽、长和高度后,主要输出立方体的表面积和体积;

假如数据输入非法(包括圆、矩形、球及立方体对象的属性不大于0和输入选择值非1-4),系统输出Wrong Format

输入格式:

共四种合法输入

  • 1 圆半径
  • 2 矩形宽、长
  • 3 球半径
  • 4 立方体宽、长、高

输出格式:

按照以上需求提示依次输出

输入样例1:

在这里给出一组输入。例如:

1 1.0

输出样例1:

在这里给出相应的输出。例如:

Constructing Shape
Constructing Circle
Circle's area:3.14
 

输入样例2:

在这里给出一组输入。例如:

4 3.6 2.1 0.01211
 

输出样例2:

在这里给出相应的输出。例如:

Constructing Shape
Constructing Rectangle
Constructing Box
Box's surface area:15.26
Box's volume:0.09
 

输入样例3:

在这里给出一组输入。例如:

2 -2.3 5.110

输出样例2:

在这里给出相应的输出。例如:

Wrong Format
UML类图:

 这是一个简单的继承题目,Main作为主类,创建图形Shape对象,Shape有两个子类分别为Circle和Rectangle类,各自分别有个具体的对象子类Ball和Box类,且要求

 构造一个对象就要输出构造的类型,这就需要在每一个构造方法里添加一个输出自己类名的方法。

在Circle和Rectangle类里需要有求面积的方法,Box和Ball除了求表面积外还需要添加求体积的方法。

以下为代码:

//import com.sun.scenario.effect.impl.sw.java.JSWBlend_HARD_LIGHTPeer;

import java.util.Scanner;


public class Main {
    public static void main(String[] args){
        Scanner input=new Scanner(System.in);
        int n= input.nextInt();
        double radius=0;
        double width=0,length=0,height=0;
        switch (n){
            case 1:{

                radius=input.nextDouble();
                if (radius<0)
                {
                    System.out.println("Wrong Format");
                    break;
                }
                Circle a=new Circle();
                a.setter(radius);
                System.out.print("Circle's area:");
                System.out.printf("%.2f",a.getArea());
                break;
            }
            case 2:{

                width=input.nextDouble();
                length=input.nextDouble();
                if (width<0||length<0)
                {
                    System.out.println("Wrong Format");
                    break;
                }
                Rectangle b=new Rectangle();
                b.setter(width,length);
                System.out.print("Rectangle's area:");
                System.out.printf("%.2f",b.getArea());
                break;
            }
            case 3:{

                radius=input.nextDouble();
                if (radius<0)
                {
                    System.out.println("Wrong Format");
                    break;
                }
                Ball c=new Ball();
                c.setter(radius);
                System.out.print("Ball's surface area:");
                System.out.printf("%.2f\n",c.getArea());
                System.out.print("Ball's volume:");
                System.out.printf("%.2f\n",c.getVolume());
                break;
            }
            case 4:{

                width=input.nextDouble();
                length= input.nextDouble();
                height=input.nextDouble();
                if (width<0||length<0||height<0)
                {
                    System.out.println("Wrong Format");
                    break;
                }
                Box d=new Box();
                d.setter(width,length,height);
                System.out.print("Box's surface area:");
                System.out.printf("%.2f\n",d.getArea());
                System.out.print("Box's volume:");
                System.out.printf("%.2f\n",d.getVolume());
                break;


            }
            default:
                System.out.println("Wrong Format");
        }
    }
}

class Shape{
    double area=0.0;

    Shape(){
        System.out.println("Constructing Shape");
    }


    public double getArea(){
        return area;
    }
}

class Circle extends Shape{
    private double radius;

    void setter(double radius){
        this.radius=radius;
    }
    Circle(){
        System.out.println("Constructing Circle");
    }
   // @Override
    public double getArea() {
        return Math.PI*radius*radius;
    }
}

class Rectangle extends Shape{
    private double width,length;
    Rectangle(){
        System.out.println("Constructing Rectangle");
    }
    void  setter(double width,double length){
        this.width=width;
        this.length=length;
    }
   // @Override
    public double getArea() {
        return width*length;
    }
}
class Ball extends Circle{
    private double radius;

    Ball(){
        System.out.println("Constructing Ball");
    }
  // @Override
    void setter(double radius){
        this.radius=radius;
    }
    public double getArea() {
        return 4*Math.PI*radius*radius;
    }
    public double getVolume(){
        return 4/3.0*Math.PI*radius*radius*radius;
    }
}
class Box extends Rectangle{
    private double width,length;
    private double height;
    Box(){
        System.out.println("Constructing Box");
    }
    void setter(double width,double length,double height){
        this.width=width;
        this.length=length;
        this.height=height;
    }

   // @Override
    public double getArea() {
        return 2*(width*length+width*height+length*height);
    }
    public double getVolume(){
        return width*length*height;
    }
}

  

 
 
7-5 图形继承与多态 (50 分)
 

掌握类的继承、多态性及其使用方法。具体需求参见作业指导书。

2021-OO第06次作业-5指导书V1.0.pdf

输入格式:

从键盘首先输入三个整型值(例如a b c),分别代表想要创建的Circle、Rectangle及Triangle对象的数量,然后根据图形数量继续输入各对象的属性值(均为实型数),数与数之间可以用一个或多个空格或回车分隔。

输出格式:

  1. 如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边关系),则输出Wrong Format
  2. 如果输入合法,则正常输出,输出内容如下(输出格式见输入输出示例):
  • 各个图形的面积;
  • 所有图形的面积总和;
  • 排序后的各个图形面积;
  • 再次所有图形的面积总和。

输入样例1:

在这里给出一组输入。例如:

1 1 1 2.3 3.2 3.2 6.5 3.2 4.2
 

输出样例1:

在这里给出相应的输出。例如:

Original area:
16.62 10.24 5.68 
Sum of area:32.54
Sorted area:
5.68 10.24 16.62 
Sum of area:32.54
 

输入样例2:

在这里给出一组输入。例如:

0 2 2 2.3 2.5 56.4 86.5 64.3 85.6 74.6544 3.2 6.1 4.5
 

输出样例2:

在这里给出相应的输出。例如:

Original area:
5.75 4878.60 2325.19 7.00 
Sum of area:7216.54
Sorted area:
5.75 7.00 2325.19 4878.60 
Sum of area:7216.54
 

输入样例3:

在这里给出一组输入。例如:

0 0 1 3 3 6
 

输出样例3:

在这里给出相应的输出。例如:

Wrong Format


我的一些思路和想法:

这道题的难度个人觉得比上一个问题难度大很多了,从思路上来说,创建的对象并不是单一的,可能需要数组来处理。
另外,需要对所输入的所有对象求出其面积并且对这些面积进行排序,需要考虑的是这个创建的对象是个变化的数,因此数据也是变化的,
所以难点就在这个地方。



代码:
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        double sum=0;//和
        Scanner input=new Scanner(System.in);
        int n1=input.nextInt();//圆的对象个数
        checkN(n1);//判断n1的输入是否合法
        Circle []circle=new Circle[n1];

        int n2=input.nextInt();//矩形的对象个数
        checkN(n2);
        Rectangle []rectangle=new Rectangle[n2];

        int n3=input.nextInt();//三角形的对象个数
        checkN(n3);
        Triangle[]triangle=new Triangle[n3];

        for (int i=0;i<n1;i++){
            circle[i]=new Circle();

            circle[i].setRadius(input.nextDouble());
            if (!circle[i].dataCheck(circle[i])){
                System.out.println("Wrong Format");
                return;
            }
            circle[i].dataCheck(circle[i]);
        }

        for (int i=0;i<n2;i++){
            rectangle[i]=new Rectangle();
            rectangle[i].setWidth(input.nextDouble());
            rectangle[i].setLength(input.nextDouble());
            if (!rectangle[i].dataCheck(rectangle[i])){
                System.out.println("Wrong Format");
                return;
            }
            rectangle[i].dataCheck(rectangle[i]);
        }
        for (int i=0;i<n3;i++){
            triangle[i]=new Triangle();
            triangle[i].setAll(input.nextDouble(), input.nextDouble(),input.nextDouble());
            if (!triangle[i].dataCheck(triangle[i])){
                System.out.println("Wrong Format");
                return;
            }
            triangle[i].dataCheck(triangle[i]);
        }
        System.out.println("Original area:");
        for (int i=0;i<n1;i++){
            System.out.printf("%.2f ",circle[i].getArea());
            sum+=circle[i].getArea();
        }
        for (int i=0;i<n2;i++){
            if (n3==0){
                System.out.printf("%.2f ",rectangle[i].getArea());
            }
            else {
                System.out.printf("%.2f ",rectangle[i].getArea());
            }
            sum+=rectangle[i].getArea();
        }
        for (int i=0;i<n3;i++){
           if (i==n3-1){
               System.out.printf("%.2f ",triangle[i].getArea());
               System.out.println();
               sum+=triangle[i].getArea();
           }
           else
           {
               System.out.printf("%.2f ",triangle[i].getArea());
               sum+=triangle[i].getArea();
           }
        }

         if (n1==0&&n2==0&&n3==0){
            System.out.println();
        }
        System.out.printf("Sum of area:%.2f\n",sum);
        System.out.println("Sorted area:");
        //short()



        double []areaList=new double[n1+n2+n3];
        for (int i=0;i<n1;i++){
            areaList[i]=circle[i].getArea();
        }
        for (int j=0;j<n2;j++){
        areaList[n1+j]=rectangle[j].getArea();
    }
        for (int k=0;k<n3;k++){
            areaList[n1+n2+k]=triangle[k].getArea();
        }

        for (int i=0;i<n1+n2+n3;i++){
            for (int j=0;j<n1+n2+n3-i-1;j++){
                if (areaList[j]>areaList[j+1]){
                    double temp=areaList[j];
                    areaList[j]=areaList[j+1];
                    areaList[j+1]=temp;
                }
            }
        }
        for (int i=0;i<areaList.length;i++){
           if (i==areaList.length-1) {
                System.out.printf("%.2f ",areaList[i]);
                System.out.println();
            }
            else
            {
                System.out.printf("%.2f ",areaList[i]);
            }
        }
         if ((n1==0&&n2==0&&n3==0)||(n1!=0&&n2!=0&&n3==0)){
            System.out.println();
        }
        System.out.printf("Sum of area:%.2f\n",sum);





    }
    static void  checkN(int n){
        if(n>=0){
            return;
        }
        else {
            System.out.println("Wrong Format");
        }
    }

    static  void checkData(){

    }
}


 class Shape {
    private double area;

    public double getArea() {
        return area;
    }
    public void dataCheck(Shape shape){
        System.out.println("");
    }

}


 class Rectangle extends  Shape {
    private double width,length;

    public void setLength(double length) {
        this.length = length;
    }

    public double getLength() {
        return length;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getWidth() {
        return width;
    }

    boolean dataCheck(Rectangle rectangle){
        if (rectangle.width<0||rectangle.length<0){
            return false;
        }
        return true;
    }
    @Override
    public double getArea() {
        return width*length;
    }


}


 class Triangle extends Shape {
    private double a, b, c;

    public void setAll(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public double getA() {
        return a;
    }

    public double getB() {
        return b;
    }

    public double getC() {
        return c;
    }

    @Override
    public double getArea() {
        double p;
        p = 1.0 / 2.0 * (a + b + c);
        return Math.sqrt(p * (p - a) * (p - b) * (p - c));
    }

    //@Override
    public boolean dataCheck(Triangle triangle) {
        if ((this.a+this.b>this.c&&this.a+this.c>this.b&&this.b+this.c>this.a)&&(this.a>0&&this.c>0&&this.b>0)){
            return true;
        }
        else{
            return false;
        }
    }
}

 class Circle extends Shape{
     double radius;

    public void setRadius(double radius) {
        this.radius = radius;
    }

    public double getRadius() {
        return radius;
    }


    @Override
    public double getArea() {
        return Math.PI*radius*radius;
    }

    public boolean dataCheck(Circle circle) {
        if(circle.radius<=0){

            return false;
        }
        return true;
    }
}

  可以看到我用的是数组的方法用来存放用户所需要的创建的每个类的数量,用循环的方法对每个对象依次赋值求各自面积的,方法较为繁琐,

但是思路便于理解,同样sum用来计算面积的和,每求出一个类的面积就累加,面积用的同样是数据来存放的,本来是打算用方法拼接为一个数组较为

简便,但是由于没找到那个方法我就只好用了笨重的方法来用for循环进行拼接。然后是一个冒泡排序,突然发现我写的这些真的太为繁琐,别人一个方法就能搞定的,我要写一长串去执行这个

东西,因此大家有好的建议可以评论留言,我会认真听取各位的意见的。

 
7-6 实现图形接口及多态性 (30 分)

编写程序,使用接口及类实现多态性,类图结构如下所示:

类图.jpg

其中:

  • GetArea为一个接口,无属性,只有一个GetArea(求面积)的抽象方法;
  • Circle及Rectangle分别为圆类及矩形类,分别实现GetArea接口
  • 要求:在Main类的主方法中分别定义一个圆类对象及矩形类对象(其属性值由键盘输入),使用接口的引用分别调用圆类对象及矩形类对象的求面积的方法,直接输出两个图形的面积值。(要求只保留两位小数)

输入格式:

从键盘分别输入圆的半径值及矩形的宽、长的值,用空格分开。

输出格式:

  • 如果输入的圆的半径值及矩形的宽、长的值非法(≤0),则输出Wrong Format
  • 如果输入合法,则分别输出圆的面积和矩形的面积值(各占一行),保留两位小数。

输入样例1:

在这里给出一组输入。例如:

2 3.6 2.45

输出样例1:

在这里给出相应的输出。例如:

12.57
8.82

输入样例2:

在这里给出一组输入。例如:

9 0.5 -7.03

输出样例2:

在这里给出相应的输出。例如:

Wrong Format

 这道题对于前面来说就简单不少,多了接口,结构也是一样的继承就能满足条件。这里就不再多余的解释,直接上代码:
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        Circle circle=new Circle();
        Rectangle rectangle=new Rectangle();
        double radius=input.nextDouble();
        double width=input.nextDouble();
        double length=input.nextDouble();
        if (radius<=0||width<=0||length<=0){
            System.out.println("Wrong Format");
        }
        else {
            circle.setRadius(radius);
            System.out.printf("%.2f\n",circle.getArea());
            rectangle.setWidth(width);
            rectangle.setLength(length);
            System.out.printf("%.2f\n",rectangle.getArea());


        }

}
}

class Circle implements GetArea{
    private double radius;
    Circle(){
    }

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }
    @Override
    public double getArea(){
        return Math.PI*radius*radius;
    }

}


 class Rectangle implements GetArea {
    private double width;
    private double length;

    Rectangle(){}
    Rectangle(double length){}
    Rectangle(double width,double length){}

    public double getWidth() {
        return width;
    }
    public void setWidth(double width) {
        this.width = width;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }
    @Override
    public double getArea(){
        return width*length;
    }
}

interface GetArea {
public double getArea();
}

  

 三:对三次题目集中用到的正则表达式技术的分析总结

 1.正则表达式训练-QQ号校验 

QQ号大家都在熟悉不过了,就算不熟悉,题目要求也清晰的提出了要求:

校验键盘输入的 QQ 号是否合格,判定合格的条件如下:

  • 要求必须是 5-15 位;
  • 0 不能开头;
  • 必须都是数字;

这里给出我的答案:[1-9]([\\d]{4,14}

[1-9]表示的是第一位数不能有0,取值范围为1-9,[\\d]等同于[0-9]数字取值0-9,{4,14}表示后面的数字的位数为4-14,正则表达式其实不唯一,就像[\\d]等价于[0-9],要表示同一种结果答案也就不唯一了。

 

2.正则表达式训练-验证码校验 

题目要求:接受给定的字符串,判断该字符串是否属于验证码。验证码是由四位数字或者字母(包含大小写)组成的字符串。

这里给出我的答案:^[a-zA-Z0-9]{1,4}+$

^:匹配输入字符串的开始位置

$:匹配输入字符串的结尾位置。

+:匹配前面的子表达式一次或多次。

 

3.正则表达式训练-学号校验

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

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

要求如下:

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

 我的答案:2020(11|12|13|14|15|16|17|61|71|72|73|81|82)(0[1-9]|[1,3][0-9]|4[0])

 根据题目要求,2020不变,班级,学号做改变,(11|12|13|14|15|16|17|61|71|72|73|81|82)表示2020后面的两位为这其中的某个数,

(0[1-9]|[1,3][0-9]|4[0])为学号位,当第一位为0,第二位取值为1-9,没有00学号。同理,后面一样。

 

 我的一些小总结:正则表达式对我来说相对是个难点,因为变换多,灵活度很强,但是学好了正则表达式,校验某个东西时就会如鱼得水,

正则表达式的规则需要多记多练,才能得到提升。

 

四:题目集5(7-4)中Java集合框架应用的分析总结

 

7-4 统计Java程序中关键词的出现次数 (25 分)

 

编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:

  • Java中共有53个关键字(自行百度)
  • 从键盘输入一段源码,统计这段源码中出现的关键字的数量
  • 注释中出现的关键字不用统计
  • 字符串中出现的关键字不用统计
  • 统计出的关键字及数量按照关键字升序进行排序输出
  • 未输入源码则认为输入非法

 

输入格式:

输入Java源码字符串,可以一行或多行,以exit行作为结束标志

输出格式:

  • 当未输入源码时,程序输出Wrong Format
  • 当没有统计数据时,输出为空
  • 当有统计数据时,关键字按照升序排列,每行输出一个关键字及数量,格式为数量\t关键字

输入样例:

在这里给出一组输入。例如:

//Test public method
public HashMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }
    public HashMap(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        this.threshold = tableSizeFor(initialCapacity);
    }
exit
 

输出样例:

在这里给出相应的输出。例如:

1    float
3    if
2    int
2    new
2    public
3    this
2    throw


这道题难度有点大,需要统计java源码关键字的个数,小编也是有点脑壳疼,不怎么太会。还需要各位同仁伸出援助之手。帮忙分析一下以下的代码。

 代码:

import java.util.*;
public class Main {
    public static void main(String[] argc){
        Scanner input = new Scanner(System.in);
        String[] str = new String[1000];
        str[0] = input.nextLine();
        int i=0;
        if(str[i]==null) {
            System.out.println("Wrong Format");
        }
        while (!str[i].equals("exit")){
            i++;
            str[i] = input.nextLine();
        }
        String s = new String();
        for(int j=0;j<i+1;j++){
            s+=str[j];
        }
        String[][] h_str = new String[1000][1000];
        for(int j=0;j< i;j++){

            String stu = "(\".*?\")";
            str[j] = str[j].replaceAll(stu, " ");
            
            h_str[j] = str[j].split("\\/\\/.*|\".*\"|\\/\\**[\\s\\S]*?\\*\\/|\\s|\\t|\\[|\\]|\\,|\\{|\\;|\\.|\\(|\\)|\\}");
            
        }
        String l_key = "abstract,assert,boolean,break,byte,case,catch,char,class,const,continue,default,do,double,else,enum,extends,false,final,finally,float,for,goto,if,implements,import,instanceof,int,interface,long,native,new,null,package,private,protected,public,return,short,static,strictfp,super,switch,synchronized,this,throw,throws,transient,true,try,void,volatile,while";
        int[] num = new int[53];
        for(int j=0;j<53;j++){
            num[j]=0;
        }
        String[] key = l_key.split(",");
        String[] e_str = new String[1000];
        int f=0;
        for(int j=0;j<i;j++){
            for(int k=0;k<h_str[j].length;k++){
                for(int l=0;l<53;l++) {
                    if(h_str[j][k].equals(key[l])){
                        e_str[f++] = h_str[j][k];
                        num[l]++;
                    }
                }
            }
        }
        String[] p_str = new String[1000];
        for(int j=0;e_str[j]!=null;j++){

            for(int k=j+1;e_str[k]!=null;k++){
                if(e_str[j]=="0") {
                    continue;
                }
                if(e_str[j].equals(e_str[k])){
                    e_str[k]="0";

                }
            }
           
        }
        int g=0;
        for(int j=0;e_str[j]!=null;j++){
            if(!e_str[j].equals("0")) {
                p_str[g++] = e_str[j];
            }
        }
        String[] end = new String[g];
        for(int j=0;j<g;j++) {
            end[j]=p_str[j];
        }
        Arrays.sort(end);
        if(g==0){
            System.out.println("Wrong Format");
        }
        for(int j=0,k=1;j<g;j++,k++){
            for(int l=0;l<53;l++){
                if(end[j].equals(key[l])) {
                    System.out.println(num[l]+"\t"+end[j]);
                }
            }

        }
    }

}
 
posted @ 2021-05-01 09:56  野猿新之助  阅读(161)  评论(0)    收藏  举报