题目集7-9的总结性Blog

 

一、前言

题目集七

知识点考察:

考察类与类之间的继承与多态的应用以及泛型的应用,之后涉及到非主类的

输入考察,Comparable接口compareTo方法的重写,图形的数据的简单合法性检验.

题目量:适中;难度:适中

题目集八

知识点考察:

重点考察类的封装性及类间关系设计(关联、组合及依赖),以及类的关系

查找,类与类之间的联系使用.

题目量:适中;难度:适中

题目集九

知识点考察:

重点考察内容为类的抽象类、继承与多态,还有简单的逻辑考虑与判断.

题目量:适中;难度:适中

 

二、设计与分析(部分分析在注释) 

 题目集7(7-1)图形卡片排序游戏

输入格式:

  • 首先,在一行上输入一串数字(1~4,整数),其中,1代表圆形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各数字之间以一个或多个空格分隔,以“0”结束。例如: 1 3 4 2 1 3 4 2 1 3 0
  • 然后根据第一行数字所代表的卡片图形类型,依次输入各图形的相关参数,例如:圆形卡片需要输入圆的半径,矩形卡片需要输入矩形的宽和长,三角形卡片需要输入三角形的三条边长,梯形需要输入梯形的上底、下底以及高。各数据之间用一个或多个空格分隔。

输出格式:

  • 如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边不能组成三角形),则输出Wrong Format
  • 如果输入合法,则正常输出,所有数值计算后均保留小数点后两位即可。输出内容如下:
  1. 排序前的各图形类型及面积,格式为图形名称1:面积值1图形名称2:面积值2 …图形名称n:面积值n ,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格;
  2. 排序后的各图形类型及面积,格式同排序前的输出;
  3. 所有图形的面积总和,格式为Sum of area:总面积值

输入样例1:

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

1 5 3 2 0

输出样例1:

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

Wrong Format

输入样例2:

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

4 2 1 3 0
3.2 2.5 0.4 2.3 1.4 5.6 2.3 4.2 3.5

输出样例2:

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

The original list:Trapezoid:1.14 Rectangle:3.22 Circle:98.52 Triangle:4.02 

The sorted list:
Circle:98.52 Triangle:4.02 Rectangle:3.22 Trapezoid:1.14 
Sum of area:106.91

代码示例:
  1 import java.util.ArrayList;
  2 import java.util.Arrays;
  3 import java.util.Collections;
  4 import java.util.Scanner;
  5 public class Main {
  6 //在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接
  7 //使用Main.input.next…即可(避免采坑)
  8     public static Scanner input = new Scanner(System.in);
  9     public static void main(String[] args) {
 10         ArrayList<Integer> list = new ArrayList<Integer>();//整数的泛型
 11         int num = input.nextInt();
 12         while(num != 0) {
 13             if(num < 0 || num > 4) {//按照题目要求判断输入合法性
 14                 System.out.println("Wrong Format");
 15                 System.exit(0);
 16             }
 17             list.add(num);//否则加入到list中
 18             num = input.nextInt();
 19         }
 20         DealCardList dealCardList = new DealCardList(list);//处理数据类
 21         if(!dealCardList.validate()) {//判断是否合法
 22             System.out.println("Wrong Format");
 23             System.exit(0);
 24         }
 25         dealCardList.showResult();//调用展示结果的方法
 26         input.close();
 27     }
 28 }
 29 abstract class Shape  {//抽象的Shape类
 30     public String shapeName;//私有属性形状名
 31     public Shape() {
 32     }
 33     public Shape(String shapeName) {
 34         this.shapeName=shapeName;
 35     }
 36     public String getshapeName() {
 37         return shapeName;
 38     }
 39     public void setshapeName(String shapeName) {
 40         this.shapeName=shapeName;
 41     }
 42     public abstract double getArea() ;//抽象方法1
 43     public abstract boolean validate() ;//抽象方法2
 44     
 45     public String toString() {
 46         return shapeName+":"+String.format("%.2f",this.getArea())+" ";
 47     }
 48 }
 49 class Card implements Comparable {
 50     private Shape shape;
 51     public Card() {
 52     }
 53     public Card(Shape shape) {
 54         this.shape = shape;
 55     }
 56     public Shape getShape() {
 57         return shape;
 58     }
 59     public void setShape(Shape shape) {
 60         this.shape = shape;
 61     }
 62     @Override
 63     public int compareTo(Object o) {//重写CompareaTO方法进行排序
 64     Card card=(Card) o;
 65         if (this.shape.getArea()> card.getShape().getArea()) {
 66             return -1;
 67         }
 68         return 1;
 69     }
 70 }
 71  class DealCardList { //数据处理类
 72     ArrayList <Card> list = new ArrayList<Card>();
 73     public DealCardList() {
 74     }
 75     public DealCardList (ArrayList <Integer>list) {
 76         for(int i=0; i<list.size(); i++) {
 77             switch(list.get(i)) {
 78             case 1:
 79                 double radius=Main.input.nextDouble();
 80                 Shape shape = new Circle(radius);
 81                 shape.setshapeName("Circle");
 82                 Card card=new Card(shape);
 83                 this.list.add(card);
 84                 break;
 85             case 2:
 86                 double width=Main.input.nextDouble();
 87                 double length= Main.input.nextDouble();
 88                 Shape shape1 = new Rectangle(width,length);
 89                 shape1.setshapeName("Rectangle");
 90                 Card card1=new Card(shape1);
 91                 this.list.add(card1);
 92                 break;
 93             case 3:
 94                 double side1=Main.input.nextDouble();
 95                 double side2=Main.input.nextDouble();
 96                 double side3=Main.input.nextDouble();
 97                 Shape shape2 = new Triangle(side1,side2,side3);
 98             shape2.setshapeName("Triangle");
 99                 Card card2=new Card(shape2);
100                 this.list.add(card2);
101                 break;
102             case 4:
103                 double topSide=Main.input.nextDouble();
104                 double bottomSide=Main.input.nextDouble();
105                 double height=Main.input.nextDouble();
106                 Shape shape3=new Trapeziod(topSide,bottomSide,height);
107             shape3.setshapeName("Trapezoid");
108                 Card card3=new Card(shape3);
109                 this.list.add(card3);
110                 break;
111             }
112         }
113     }
114     public boolean validate() {//检验各个图形是否合法
115         if(list.size()<0)
116             return false;
117         for(int i=0; i<list.size(); i++) {
118             if(!list.get(i).getShape().validate())
119                 return false;
120         }
121         return true;
122     }
123     public double getAllArea() {//获得各个面积和
124         double sum=0;
125         for(int i=0; i<list.size(); i++)
126             sum+=list.get(i).getShape().getArea();
127         return sum;
128     }
129     public void showResult() {
130         System.out.println("The original list:");
131         for(int i=0; i<list.size(); i++)
132             System.out.print(list.get(i).getShape().toString());
133             System.out.println("");
134             Collections.sort(list);
135         System.out.println("The sorted list:");
136         for(int i=0; i<list.size(); i++)
137             System.out.print(list.get(i).getShape().toString());
138         System.out.println("");
139         System.out.println("Sum of area:"+String.format("%.2f",this.getAllArea()));
140     }
141 }
142 class Circle extends Shape {//继承于抽象Shape类
143     private double radius;
144     public Circle() {
145 
146     }
147     public Circle(double radius) {
148         this.radius = radius;
149     }
150     public double getRadius() {
151         return radius;
152     }
153     public void setRadius(double radius) {
154         this.radius = radius;
155     }
156     @Override
157     public double getArea() {
158         // TODO Auto-generated method stub
159         return Math.PI*radius*radius;
160     }
161     @Override
162     public boolean validate() {
163         // TODO Auto-generated method stub
164         if(radius<=0)
165             return false;
166         else
167             return true;
168     }
169 }
170 class Rectangle extends Shape {//继承于抽象类中
171     private double width;
172     private double length;
173     public Rectangle(double width,double length) {
174         this.width = width;
175         this.length = length;
176     }
177     public double getWidth() {
178         return width;
179     }
180     public void setWidth(double width) {
181         this.width = width;
182     }
183     public double getLength() {
184         return length;
185     }
186     public void setLength(double length) {
187         this.length = length;
188     }
189     @Override
190     public double getArea() {
191         // TODO Auto-generated method stub
192         return width*length;
193     }
194     @Override
195     public boolean validate() {
196         // TODO Auto-generated method stub
197         if(width<=0||length<=0)
198             return false;
199         else
200             return true;
201     }
202 }
203 class Triangle extends Shape {//继承抽象类
204     private double side1;
205     private double side2;
206     private double side3;
207     public Triangle(double side1,double side2,double side3) {
208         this.side1 = side1;
209         this.side2 = side2;
210         this.side3 = side3;
211     }
212     public double getSide1() {
213         return side1;
214     }
215     public void setSide1(double side1) {
216         this.side1 = side1;
217     }
218     public double getSide2() {
219         return side2;
220     }
221     public void setSide2(double side2) {
222         this.side2 = side2;
223     }
224     public double getSide3() {
225         return side3;
226     }
227     public void setSide3(double side3) {
228         this.side3 = side3;
229     }
230     @Override
231     public double getArea() {
232         // TODO Auto-generated method stub
233         double p=(side1+side2+side3)/2;
234         return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
235     }
236     @Override
237     public boolean validate() {
238         // TODO Auto-generated method stub
239         double [] a = new double [3];
240         a[0]= side1;
241         a[1]=side2;
242         a[2]=side3;
243         Arrays.sort(a);
244         if(a[0]+a[1]<=a[2]||a[0]<0||a[1]<0||a[2]<0)
245             return false;
246         else
247             return true;
248     }
249 }
250 class Trapeziod extends Shape{//继承抽象类
251     private double topSide;
252     private double bottomSide;
253     private double height;
254     public Trapeziod() {
255     }
256     public Trapeziod(double topSide,double bottomSide,double height) {
257         this.topSide=topSide;
258         this.bottomSide=bottomSide;
259         this.height=height;
260     }
261     public double getArea() {
262         return (topSide+bottomSide)*height/2;
263     }
264     public boolean validate() {
265         return true;
266     }
267 }

 SourceMonitor的生成报表内容以及PowerDesigner的相应类图

 

 最大圈复杂度为5题目逻辑较为简单

 

 类图分析:四个具体的形状类继承于Shape类有各自的算面积方法以及检验合法性方法

工具类DealCardList来实现面积求和以及展示结果

Card类与Shape类聚合来获取形状和设置形状卡片再用compareTO方法排序

7-2 图形卡片分组游戏
代码示例:
  1 import java.util.ArrayList;
  2 import java.util.Arrays;
  3 import java.util.Collections;
  4 import java.util.Scanner;
  5 public class Main {
  6 //在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接
  7 //使用Main.input.next…即可(避免采坑)
  8     public static Scanner input = new Scanner(System.in);
  9     public static void main(String[] args) {
 10         ArrayList<Integer> list = new ArrayList<Integer>();
 11         int num = input.nextInt();
 12         while(num != 0) {
 13             if(num < 0 || num > 4) {//检验输入是否合法
 14                 System.out.println("Wrong Format");
 15                 System.exit(0);
 16             }
 17             list.add(num);
 18             num = input.nextInt();
 19         }
 20         DealCardList dealCardList = new DealCardList(list);//创建工具类
 21         if(!dealCardList.validate()) {
 22             System.out.println("Wrong Format");
 23             System.exit(0);
 24         }
 25         dealCardList.showResult();
 26         input.close();
 27     }
 28 }
 29 abstract class Shape  {//抽象类shape
 30     public String shapeName;
 31     public Shape() {
 32     }
 33     public Shape(String shapeName) {
 34         this.shapeName=shapeName;
 35     }
 36     public String getshapeName() {
 37         return shapeName;
 38     }
 39     public void setshapeName(String shapeName) {
 40         this.shapeName=shapeName;
 41     }
 42     public abstract double getArea() ;//抽象方法1
 43     public abstract boolean validate() ;//抽象方法2
 44     
 45     public String toString() {
 46         return shapeName+":"+String.format("%.2f",this.getArea())+" ";
 47     }
 48 }
 49 class Card implements Comparable {
 50     private Shape shape;
 51     public Card() {
 52     }
 53     public Card(Shape shape) {
 54         this.shape = shape;
 55     }
 56     public Shape getShape() {
 57         return shape;
 58     }
 59     public void setShape(Shape shape) {
 60         this.shape = shape;
 61     }
 62     @Override
 63     public int compareTo(Object o) {
 64     Card card=(Card) o;
 65         if (this.shape.getArea()> card.getShape().getArea()) {
 66             return -1;
 67         }
 68         return 1;
 69     }
 70 }
 71  class DealCardList { //工具类DealCardList
 72     ArrayList <Card> list = new ArrayList<Card>();//总列表
 73     ArrayList <Card> circle = new ArrayList<Card>();//圆的
 74     ArrayList <Card> rectangle = new ArrayList<Card>();//矩形
 75     ArrayList <Card> triangle = new ArrayList<Card>();三角形
 76     ArrayList <Card> trapezoid = new ArrayList<Card>();//梯形
 77     public DealCardList() {
 78     }
 79     public DealCardList (ArrayList <Integer>list) {
 80         for(int i=0; i<list.size(); i++) {
 81             switch(list.get(i)) {
 82             case 1:
 83                 double radius=Main.input.nextDouble();
 84                 Shape shape = new Circle(radius);
 85                 shape.setshapeName("Circle");
 86                 Card card=new Card(shape);
 87                 this.list.add(card);
 88                 this.circle.add(card);
 89                 break;
 90             case 2:
 91                 double width=Main.input.nextDouble();
 92                 double length= Main.input.nextDouble();
 93                 Shape shape1 = new Rectangle(width,length);
 94                 shape1.setshapeName("Rectangle");
 95                 Card card1=new Card(shape1);
 96                 this.list.add(card1);
 97                this.rectangle.add(card1);
 98                 break;
 99             case 3:
100                 double side1=Main.input.nextDouble();
101                 double side2=Main.input.nextDouble();
102                 double side3=Main.input.nextDouble();
103                 Shape shape2 = new Triangle(side1,side2,side3);
104             shape2.setshapeName("Triangle");
105                 Card card2=new Card(shape2);
106                 this.list.add(card2);
107             this.triangle.add(card2);
108                 break;
109             case 4:
110                 double topSide=Main.input.nextDouble();
111                 double bottomSide=Main.input.nextDouble();
112                 double height=Main.input.nextDouble();
113                 Shape shape3=new Trapeziod(topSide,bottomSide,height);
114             shape3.setshapeName("Trapezoid");
115                 Card card3=new Card(shape3);
116                 this.list.add(card3);
117             this.trapezoid.add(card3);
118                 break;
119             }
120         }
121     }
122     public boolean validate() {//检验总的合法性
123         if(list.size()<=0)
124             return false;
125         for(int i=0; i<list.size(); i++) {
126             if(!list.get(i).getShape().validate())
127                 return false;
128         }
129         return true;
130     }
131     public double getAllArea(ArrayList <Card>list) {//检验所有面积
132         double sum=0;
133         for(int i=0; i<list.size(); i++)
134             sum+=list.get(i).getShape().getArea();
135         return sum;
136     }
137     public void Print(ArrayList <Card>list){
138     System.out.print("[");
139     for(int i=0;i<list.size();i++)
140             System.out.print(list.get(i).getShape().toString());
141             System.out.print("]");
142      }
143     public double Max(ArrayList <Card>list1,ArrayList <Card>list2,ArrayList <Card>list3,ArrayList <Card>list4){//找出最大的形状
144     double [] a = new double[4];
145     double max=0;
146     a[0]=getAllArea(list1);
147     a[1]=getAllArea(list2);
148     a[2]=getAllArea(list3);
149     a[3]=getAllArea(list4);
150     for(int i=0;i<4;i++){
151         if(a[i]>max)
152             max=a[i];
153     }
154     return max;
155     }
156     public void showResult() {//展示总结果以及输出题目要求的格式
157         System.out.println("The original list:");
158         System.out.print("[");
159         for(int i=0; i<list.size(); i++)
160             System.out.print(list.get(i).getShape().toString());
161             System.out.println("]");
162             System.out.println("The Separated List:");
163             Print(circle);
164             Print(rectangle);
165             Print(triangle);
166             Print(trapezoid);
167             System.out.println("");
168             Collections.sort(circle);
169              Collections.sort(rectangle);
170             Collections.sort(triangle);
171             Collections.sort(trapezoid);
172             System.out.println("The Separated sorted List:");
173             Print(circle);
174             Print(rectangle);
175             Print(triangle);
176             Print(trapezoid);
177             System.out.println("");
178         System.out.println("The max area:"+String.format("%.2f",Max(circle,rectangle,triangle,trapezoid)));
179     }
180 }
181 class Circle extends Shape {//圆继承Shape
182     private double radius;
183     public Circle() {
184 
185     }
186     public Circle(double radius) {
187         this.radius = radius;
188     }
189     public double getRadius() {
190         return radius;
191     }
192     public void setRadius(double radius) {
193         this.radius = radius;
194     }
195     @Override
196     public double getArea() {
197         // TODO Auto-generated method stub
198         return Math.PI*radius*radius;
199     }
200     @Override
201     public boolean validate() {
202         // TODO Auto-generated method stub
203         if(radius<=0)
204             return false;
205         else
206             return true;
207     }
208 }
209 class Rectangle extends Shape {//继承
210     private double width;
211     private double length;
212     public Rectangle(double width,double length) {
213         this.width = width;
214         this.length = length;
215     }
216     public double getWidth() {
217         return width;
218     }
219     public void setWidth(double width) {
220         this.width = width;
221     }
222     public double getLength() {
223         return length;
224     }
225     public void setLength(double length) {
226         this.length = length;
227     }
228     @Override
229     public double getArea() {
230         // TODO Auto-generated method stub
231         return width*length;
232     }
233     @Override
234     public boolean validate() {
235         // TODO Auto-generated method stub
236         if(width<=0||length<=0)
237             return false;
238         else
239             return true;
240     }
241 }
242 class Triangle extends Shape {//继承
243     private double side1;
244     private double side2;
245     private double side3;
246     public Triangle(double side1,double side2,double side3) {
247         this.side1 = side1;
248         this.side2 = side2;
249         this.side3 = side3;
250     }
251     public double getSide1() {
252         return side1;
253     }
254     public void setSide1(double side1) {
255         this.side1 = side1;
256     }
257     public double getSide2() {
258         return side2;
259     }
260     public void setSide2(double side2) {
261         this.side2 = side2;
262     }
263     public double getSide3() {
264         return side3;
265     }
266     public void setSide3(double side3) {
267         this.side3 = side3;
268     }
269     @Override
270     public double getArea() {
271         // TODO Auto-generated method stub
272         double p=(side1+side2+side3)/2;
273         return Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
274     }
275     @Override
276     public boolean validate() {
277         // TODO Auto-generated method stub
278         double [] a = new double [3];
279         a[0]= side1;
280         a[1]=side2;
281         a[2]=side3;
282         Arrays.sort(a);
283         if(a[0]+a[1]<=a[2]||a[0]<0||a[1]<0||a[2]<0)
284             return false;
285         else
286             return true;
287     }
288 }
289 class Trapeziod extends Shape{//继承
290     private double topSide;
291     private double bottomSide;
292     private double height;
293     public Trapeziod() {
294     }
295     public Trapeziod(double topSide,double bottomSide,double height) {
296         this.topSide=topSide;
297         this.bottomSide=bottomSide;
298         this.height=height;
299     }
300     public double getArea() {
301         return (topSide+bottomSide)*height/2;
302     }
303     public boolean validate() {
304         return true;
305     }
306 }
 SourceMonitor的生成报表内容以及PowerDesigner的相应类图

 

  最大圈复杂度为5题目逻辑较为简单

 

 

类图分析:四个具体的形状类继承于Shape类有各自的算面积方法以及检验合法性方法

工具类DealCardList来实现面积求和以及展示结果并在一的基础之上加了求其最大值的方法

并加上了四个形状list来储存数据,Max方法用来求出最大的面积

Card类与Shape类聚合来获取形状和设置形状卡片再用compareTO方法排序

Shape类也在一的基础之上加了toStrong方法

分析总结:这两次题目都使用到了类的聚合与继承,从而提高代码复用率在构造的时候许

考虑清楚该如何构建,并结合数据构建,为了使类的单一职责时,此时不得不构造工具类来

完成题目要求.在对类排序并依靠类的属性排序依据时需要对于接口方法的重写,抽象方

法的实现可以在子类来写成

 题目集8(8-1)

 

  1 import java.util.ArrayList;
  2 import java.util.Arrays;
  3 import java.util.Collections;
  4 import java.util.Iterator;
  5 import java.util.Scanner;
  6 
  7 import javax.swing.text.Position;
  8 
  9 public class Main {
 10     public static void main(String[] args) {
 11       Scanner in = new Scanner(System.in);
 12       Card card1 = new Card("6217000010041315709");
 13       Card card2 = new Card("6217000010041315715");
 14       ArrayList<Card> cardlist1 = new ArrayList<Card>();
 15       cardlist1.add(card1);
 16       cardlist1.add(card2);
 17       Card card3 = new Card("6217000010041315718");
 18       ArrayList<Card> cardlist2 = new ArrayList<Card>();
 19       cardlist2.add(card3);
 20       Card card4 = new Card("6217000010051320007");
 21       ArrayList<Card> cardlist3 = new ArrayList<Card>();
 22       cardlist3.add(card4);
 23       Card card5 = new Card("6222081502001312389");
 24       ArrayList<Card> cardlist4 = new ArrayList<Card>();
 25       cardlist4.add(card5);
 26       Card card6 = new Card("6222081502001312390");
 27       ArrayList<Card> cardlist5= new ArrayList<Card>();
 28       cardlist5.add(card6);
 29       Card card7 = new Card("6222081502001312399");
 30       Card card8 = new Card("6222081502001312400");
 31       ArrayList<Card> cardlist6= new ArrayList<Card>();
 32       cardlist6.add(card7);
 33       cardlist6.add(card8);
 34       Card card9 = new Card("6222081502051320785");
 35       ArrayList<Card> cardlist7= new ArrayList<Card>();
 36       cardlist7.add(card9);
 37       Card card10 = new Card("6222081502051320786");
 38       ArrayList<Card> cardlist8= new ArrayList<Card>();
 39       cardlist8.add(card10);
 40       ATM atm1 = new ATM("01");
 41       ATM atm2 = new ATM("02");
 42       ATM atm3 = new ATM("03");
 43       ATM atm4 = new ATM("04");
 44       ArrayList<ATM> atmlist1= new ArrayList<ATM>();
 45       atmlist1.add(atm1);
 46       atmlist1.add(atm2);
 47       atmlist1.add(atm3);
 48       atmlist1.add(atm4);
 49       ATM atm5 = new ATM("05");
 50       ATM atm6 = new ATM("06");
 51       ArrayList<ATM> atmlist2= new ArrayList<ATM>();
 52       atmlist2.add(atm5);
 53       atmlist2.add(atm6);
 54       Account account1 = new Account("3217000010041315709",10000.00,cardlist1);
 55       Account account2 = new Account("3217000010041315715",10000.00,cardlist2);
 56       ArrayList<Account> accountlist1= new ArrayList<Account>();
 57       accountlist1.add(account1);
 58       accountlist1.add(account2);
 59       Account account3 = new Account("3217000010051320007",10000.00,cardlist3);
 60       ArrayList<Account> accountlist2= new ArrayList<Account>();
 61       accountlist2.add(account3);
 62       Account account4 = new Account("3222081502001312389",10000.00,cardlist4);
 63       Account account5 = new Account("3222081502001312390",10000.00,cardlist5);
 64       Account account6 = new Account("3222081502001312399",10000.00,cardlist6);
 65       ArrayList<Account> accountlist3= new ArrayList<Account>();
 66       accountlist3.add(account4);
 67       accountlist3.add(account5);
 68       accountlist3.add(account6);
 69       Account account7 = new Account("3222081502051320785",10000.00,cardlist7);
 70       Account account8 = new Account("3222081502051320786",10000.00,cardlist8);
 71       ArrayList<Account> accountlist4= new ArrayList<Account>();
 72       accountlist4.add(account7);
 73       accountlist4.add(account8);
 74       User user1 = new User("杨过",accountlist1);
 75       User user2 = new User("郭靖",accountlist2);
 76       User user3 = new User("张无忌",accountlist3);
 77       User user4 = new User("韦小宝",accountlist4);
 78       ArrayList<User> userlist1= new ArrayList<User>();
 79       ArrayList<User> userlist2= new ArrayList<User>();
 80       userlist1.add(user1);
 81       userlist1.add(user2);
 82       userlist2.add(user3);
 83       userlist2.add(user4);
 84       Bank bank1=new Bank("中国建设银行",userlist1,atmlist1);
 85       Bank bank2=new Bank("中国工商银行",userlist2,atmlist2);
 86       ArrayList<Bank> banklist=new ArrayList<Bank>();
 87       banklist.add(bank1);
 88       banklist.add(bank2);
 89       ChinaUnionPay chinaunionpay = new ChinaUnionPay(banklist);//创建好各个数据方面的关系
 90       String line =in.nextLine();
 91       while(line!="#"&&line.length()!=0) {
 92           Dealdata dealdata = new Dealdata(line,chinaunionpay);
 93           CaluteData calutedata=new CaluteData(dealdata);
 94           if(line.length()>2) {
 95           if(dealdata.validata())
 96           calutedata.print();
 97           }
 98           line =in.nextLine();
 99       }
100       in.close();
101     }
102 }
103 class ChinaUnionPay {//银联类
104 private ArrayList<Bank> banklist;//银联所包含的银行类列表
105 public ChinaUnionPay() {
106     
107 }
108 public ChinaUnionPay( ArrayList<Bank> banklist) {
109 this.banklist=banklist;
110 }
111 public ArrayList<Bank> getBanklist() {
112     return banklist;
113 }
114 public void setBanklist(ArrayList<Bank> banklist) {
115     this.banklist = banklist;
116 }
117 }
118  class Bank{//银行类
119      private String bankname;//银行名
120      private ArrayList<User> userList;//用户列表
121      private ArrayList<ATM> atmList;//银行的ATM机列表
122     public Bank(String bankname) {
123         this.bankname=bankname;
124     }
125     public Bank(String name,ArrayList<User> userList,ArrayList<ATM> atmList) {
126         this.setbankName(name);
127         this.setUserList(userList);
128         this.setAtmList(atmList);
129     }
130     public ArrayList<ATM> getAtmList() {
131         return atmList;
132     }
133     public void setAtmList(ArrayList<ATM> atmList) {
134         this.atmList = atmList;
135     }
136     public ArrayList<User> getUserList() {
137         return userList;
138     }
139     public void setUserList(ArrayList<User> userList) {
140         this.userList = userList;
141     }
142     public String getbankName() {
143         return bankname;
144     }
145     public void setbankName(String name) {
146         this.bankname = name;
147     }
148     
149 }
150 class User{//用户类
151     private String name;用户名
152     private ArrayList<Account> accountList;//账户列表一个用户有多个账户
153     public User(String name) {
154         this.name = name;
155     }
156     public User(String name,ArrayList<Account> accountList) {
157         this.name=name;
158         this.setAccountList(accountList);
159     }
160     public String getName() {
161         return name;
162     }
163     public void setName(String name) {
164         this.name = name;
165     }
166     public ArrayList<Account> getAccountList() {
167         return accountList;
168     }
169     public void setAccountList(ArrayList<Account> accountList) {
170         this.accountList = accountList;
171     }
172 }
173 class Account{//账户类
174     private String name;
175     private double moneynum;
176     private ArrayList<Card> cardList;卡类的链表
177     public Account(String name,double moneynum) {
178     this.setName(name);
179     this.setMoneynum(moneynum);
180     }
181     public Account(String name,double moneynum,ArrayList<Card> cardList) {
182     this.setName(name);
183     this.setMoneynum(moneynum);
184     this.setCardList(cardList);
185     }
186     public ArrayList<Card> getCardList() {
187         return cardList;
188     }
189 
190     public void setCardList(ArrayList<Card> cardList) {
191         this.cardList = cardList;
192     }
193     public String getName() {
194         return name;
195     }
196     public void setName(String name) {
197         this.name = name;
198     }
199     public double getMoneynum() {
200         return moneynum;
201     }
202     public void setMoneynum(double moneynum) {
203         this.moneynum = moneynum;
204     }
205      
206 }
207 class Card  {//卡类
208     private String cardId;卡的卡号
209     private String cardKey="88888888";卡的密码
210     public Card() {
211         
212     }
213     public Card(String cardId ){
214         this.cardId=cardId;
215         
216     }
217     public String getCardId() {
218         return cardId;
219     }
220     public void setCardId(String cardId) {
221         this.cardId = cardId;
222     }
223     public String getCardKey() {
224         return cardKey;
225     }
226     public void setCardKey(String cardKey) {
227         this.cardKey = cardKey;
228     }
229 
230 }
231 class ATM{//ATM类
232     private String atmid;
233     public ATM() {
234         
235     }
236     public ATM(String atmid) {
237         this.setAtmid(atmid);
238     }
239     public String getAtmid() {
240         return atmid;
241     }
242     public void setAtmid(String atmid) {
243         this.atmid = atmid;
244     }
245 }
246 class Dealdata{//工具类Dealdata
247     private String data1;
248     private String []data;
249     private int [] posotion;
250     private  ChinaUnionPay chinaunionpay;
251     public Dealdata() {
252         
253     }
254     public Dealdata(String data1,ChinaUnionPay chinaunionpay) {
255         this.data1=data1;
256         this.chinaunionpay=chinaunionpay;
257     }
258     public ChinaUnionPay getChinaunionpay() {
259         return chinaunionpay;
260     }
261     public void setChinaunionpay(ChinaUnionPay chinaunionpay) {
262         this.chinaunionpay = chinaunionpay;
263     }
264     public int [] getPosotion() {
265         return posotion;
266     }
267     public void setPosotion(int [] posotion) {
268         this.posotion = posotion;
269     }
270     public String[] getData() {
271         return data;
272     }
273     public void setData(String[] data) {
274         this.data = data;
275     }
276     public int model() {
277         this.data=data1.split("\\s+",4);
278         if(data.length>2)
279             return 1;
280         else
281          return 2;
282     }
283     public boolean valiCard(){//检验卡是否存在如果存在就返回其位置
284         this.model();
285         int[]pos=new int[4];
286         for(int i=0;i<this.chinaunionpay.getBanklist().size();i++) {
287           for(int j=0;j<this.chinaunionpay.getBanklist().get(i).getUserList().size();j++) {
288              for(int k=0;k<this.chinaunionpay.getBanklist().get(i).getUserList().get(j).getAccountList().size();k++) {
289                 for(int l=0;l<this.chinaunionpay.getBanklist().get(i).getUserList().get(j).getAccountList().get(k).getCardList().size();l++) {
290                     if(this.chinaunionpay.getBanklist().get(i).getUserList().get(j).getAccountList().get(k).getCardList().get(l).getCardId().equals(data[0])) {
291                         pos[0]=i;
292                         pos[1]=j;
293                         pos[2]=k;
294                         pos[3]=l;
295                         this.setPosotion(pos);
296                         return true;
297                     }
298                 }
299             }
300         }
301      }
302         return false;
303     }
304     public boolean valiATM(){检验ATM是否存在
305         for(int i=0;i<this.chinaunionpay.getBanklist().size();i++) {
306             for(int j=0;j<this.chinaunionpay.getBanklist().get(i).getAtmList().size();j++)
307             if(this.chinaunionpay.getBanklist().get(i).getAtmList().get(j).getAtmid().equals(data[2]))
308                 return true;
309         }
310         return false;
311     }
312     public boolean valiKey(){检验密码
313     if(data[1].equals("88888888"))
314         return true;
315     return false;
316     }
317     public  boolean valimoney(){检验账户余额
318         if(Double.parseDouble(data[3])>0&&Double.parseDouble(data[3])>this.chinaunionpay.getBanklist().get(posotion[0]).getUserList().get(posotion[1]).getAccountList().get(posotion[2]).getMoneynum()) {
319             return false;
320         }
321         return true;        
322     }
323     public  boolean valibank() {//检验银行
324             for(int j=0;j<this.chinaunionpay.getBanklist().get(this.posotion[0]).getAtmList().size();j++) {
325             if(this.chinaunionpay.getBanklist().get(this.posotion[0]).getAtmList().get(j).getAtmid().equals(data[2]))
326             return true;
327         }
328         return false;
329     }
330     public  boolean validata() {
331         boolean flag=true;
332         if(!this.valiCard()) {
333             System.out.println("Sorry,this card does not exist.");
334             flag=false;
335         }
336         if(this.model()!=1)
337             return true;
338         if(!this.valiATM()) {
339             System.out.println("Sorry,the ATM's id is wrong.");
340             flag=false;
341         }
342         if(!valiKey()) {
343             System.out.println("Sorry,your password is wrong.");
344             flag=false;
345         }
346         if(!valimoney()) {
347             System.out.println("Sorry,your account balance is insufficient.");
348             flag=false;
349         }
350         if(this.valiATM()&&!this.valibank()) {
351             System.out.println("Sorry,cross-bank withdrawal is not supported.");
352             flag=false;
353         }
354         return flag;
355     }
356 }
357 class CaluteData{//计算数据类
358    private Dealdata dealdata;
359    private double aftermoney;
360     public CaluteData() {
361         
362     }
363     public CaluteData(Dealdata dealdata) {
364         this.dealdata=dealdata;
365     }
366     public Dealdata getDealdata() {
367         return dealdata;
368     }
369 
370     public void setDealdata(Dealdata dealdata) {
371         this.dealdata = dealdata;
372     }
373     
374     public double getAftermoney() {
375         return aftermoney;
376     }
377     public void setAftermoney(double aftermoney) {
378         this.aftermoney = aftermoney;
379     }
380     public void calute() {
381         this.setAftermoney(this.dealdata.getChinaunionpay().getBanklist().get(dealdata.getPosotion()[0]).getUserList().get(dealdata.getPosotion()[1]).getAccountList().get(dealdata.getPosotion()[2]).getMoneynum()-Double.parseDouble(this.dealdata.getData()[3]));
382         this.dealdata.getChinaunionpay().getBanklist().get(dealdata.getPosotion()[0]).getUserList().get(dealdata.getPosotion()[1]).getAccountList().get(dealdata.getPosotion()[2]).setMoneynum(this.getAftermoney());
383         //System.out.println(this.dealdata.getChinaunionpay().getBanklist().get(dealdata.getPosotion()[0]).getUserList().get(dealdata.getPosotion()[1]).getMoneynum());
384     }
385     public void print() {//显示出结果
386         int choice=this.dealdata.model();
387         switch(choice) {
388         case 1:
389             String name=this.dealdata.getChinaunionpay().getBanklist().get(this.dealdata.getPosotion()[0]).getUserList().get(this.dealdata.getPosotion()[1]).getName();
390             String bankname=this.dealdata.getChinaunionpay().getBanklist().get(this.dealdata.getPosotion()[0]).getbankName();
391             String atm=this.dealdata.getData()[2];
392             String money=this.dealdata.getData()[3].replaceAll("-","");
393             if(Double.parseDouble(this.dealdata.getData()[3])>0) {
394                 System.out.println(name+"在"+ bankname+"的"+atm+"号ATM机上取款¥"+money);
395                 this.calute();
396                 System.out.println("当前余额为¥"+String.format("%.2f",this.getAftermoney()));
397             }
398             if(Double.parseDouble(this.dealdata.getData()[3])<0) {
399                 System.out.println(name+"在"+ bankname+"的"+atm+"号ATM机上存款¥"+money);
400                 this.calute();
401                 System.out.println("当前余额为¥"+String.format("%.2f",this.getAftermoney()));
402             }
403             break;
404         case 2:
405             System.out.println("¥"+String.format("%.2f",this.dealdata.getChinaunionpay().getBanklist().get(dealdata.getPosotion()[0]).getUserList().get(dealdata.getPosotion()[1]).getAccountList().get(dealdata.getPosotion()[2]).getMoneynum()));
406             break;
407         }
408     }
409 }

 

 

 

 

 最大圈复杂度为7题目仍不复杂主要是处理好类与类之间的关系

 

 

 类图分析:银联聚合银行,银行聚合用户和atm机,用户类聚合账户,账户聚合卡,Dealdata类聚合了

银联和CaluteData类,通过一级级的联系从而寻找到要取款的卡的信息

找到卡之后记录卡的位置传入工具类从而解决问题

题目集九9-1


  1 import java.util.ArrayList;
  2 import java.util.Scanner;
  3 import java.util.Iterator;
  4 import java.util.regex.Matcher;
  5 import java.util.regex.Pattern;
  6 
  7 public class Main {
  8     public static void main(String[] args) {
  9         Scanner input = new Scanner(System.in);
 10         
 11         UnionPay unionPay = new UnionPay(0.05,-50000); //创建银联,设置透支利率以及最大透支额度
 12         
 13         Bank ccb = new Bank("1001","中国建设银行",0.02);//创建银行并设置手续费
 14         Bank icbc = new Bank("1002","中国工商银行",0.03);
 15         Bank tabc = new Bank("1003","中国农业银行",0.04);
 16         
 17         unionPay.addBank(ccb);
 18         unionPay.addBank(icbc);
 19         unionPay.addBank(tabc);
 20         
 21         ATM aTM1 = new ATM("01",ccb);//创建atm类
 22         ATM aTM2 = new ATM("02",ccb);
 23         ATM aTM3 = new ATM("03",ccb);
 24         ATM aTM4 = new ATM("04",ccb);
 25         ATM aTM5 = new ATM("05",icbc);
 26         ATM aTM6 = new ATM("06",icbc);
 27         ATM aTM7 = new ATM("07",tabc);
 28         ATM aTM8 = new ATM("08",tabc);
 29         ATM aTM9 = new ATM("09",tabc);
 30         ATM aTM10 = new ATM("10",tabc);
 31         ATM aTM11 = new ATM("11",tabc);
 32         
 33         ccb.addATM(aTM1);
 34         ccb.addATM(aTM2);
 35         ccb.addATM(aTM3);
 36         ccb.addATM(aTM4);
 37         icbc.addATM(aTM5);
 38         icbc.addATM(aTM6);
 39         tabc.addATM(aTM7);
 40         tabc.addATM(aTM8);
 41         tabc.addATM(aTM9);
 42         tabc.addATM(aTM10);
 43         tabc.addATM(aTM11);
 44         
 45         User Yangguo = new User("360101200102122324","杨过","13856223254");//构建用户数据
 46         User Guojing = new User("360101200012302552","郭靖","13800021124");
 47         User Zhangwuji = new User("360502199805163221","张无忌","13952110011");
 48         User Weixiaobao = new User("360201200513243326","韦小宝","13025996587");
 49         User Zhangsanfong = new User("3640000010045442002","张三丰","12345678910");
 50         User Linghuchong = new User("3640000010045441009","令狐冲","12345678910");
 51         User Qiaofong = new User("3630000010033431001","乔峰","12345678910");
 52         User Hongqigong = new User("3630000010033431008","洪七公","12345678910");
 53         
 54         Account ccbAcc1 = new DebitAccount("3217000010041315709",10000.00,Yangguo,ccb,"1");//创建账户,贷款账户和借记账户
 55         Account ccbAcc2 = new DebitAccount("3217000010041315715",10000.00,Yangguo,ccb,"1");
 56         Account ccbAcc3 = new DebitAccount("3217000010051320007",10000.00,Guojing,ccb,"1");
 57         Account ccbAcc4 = new CreditAccount("3640000010045442002",10000.00,Zhangsanfong,ccb,"2");
 58         Account icbcAcc1 = new DebitAccount("3222081502001312389",10000.00,Zhangwuji,icbc,"1");
 59         Account icbcAcc2 = new DebitAccount("3222081502001312390",10000.00,Zhangwuji,icbc,"1");
 60         Account icbcAcc3 = new DebitAccount("3222081502001312399",10000.00,Zhangwuji,icbc,"1");
 61         Account icbcAcc4 = new DebitAccount("3222081502051320785",10000.00,Weixiaobao,icbc,"1");
 62         Account icbcAcc5 = new DebitAccount("3222081502051320786",10000.00,Weixiaobao,icbc,"1");
 63         Account icbcAcc6 = new CreditAccount("3640000010045441009",10000.00,Linghuchong,icbc,"2");
 64         Account tabcAcc1 = new CreditAccount("3630000010033431001",10000.00,Qiaofong,tabc,"2");
 65         Account tabcAcc2 = new CreditAccount("3630000010033431008",10000.00,Hongqigong,tabc,"2");
 66         
 67         ccb.addAccount(ccbAcc1);
 68         ccb.addAccount(ccbAcc2);
 69         ccb.addAccount(ccbAcc3);
 70         ccb.addAccount(ccbAcc4);
 71         icbc.addAccount(icbcAcc1);
 72         icbc.addAccount(icbcAcc2);
 73         icbc.addAccount(icbcAcc3);
 74         icbc.addAccount(icbcAcc4);
 75         icbc.addAccount(icbcAcc5);
 76         icbc.addAccount(icbcAcc6);
 77         tabc.addAccount(tabcAcc1);
 78         tabc.addAccount(tabcAcc2);
 79         
 80         Yangguo.addAccount(ccbAcc1);
 81         Yangguo.addAccount(ccbAcc2);
 82         Guojing.addAccount(ccbAcc3);
 83         Zhangsanfong.addAccount(ccbAcc4);
 84         Zhangwuji.addAccount(icbcAcc1);
 85         Zhangwuji.addAccount(icbcAcc2);
 86         Zhangwuji.addAccount(icbcAcc3);
 87         Weixiaobao.addAccount(icbcAcc4);
 88         Weixiaobao.addAccount(icbcAcc5);
 89         Linghuchong.addAccount(icbcAcc6);
 90         Qiaofong.addAccount(tabcAcc1);
 91         Hongqigong.addAccount(tabcAcc2);
 92         
 93         Card ccbCard1 = new DebitCard("6217000010041315709","88888888",ccbAcc1,"1");//创建卡分信用卡和借记卡
 94         Card ccbCard2 = new DebitCard("6217000010041315715","88888888",ccbAcc1,"1");
 95         Card ccbCard3 = new DebitCard("6217000010041315718","88888888",ccbAcc2,"1");
 96         Card ccbCard4 = new DebitCard("6217000010051320007","88888888",ccbAcc3,"1");
 97         Card ccbCard5 = new CreditCard("6640000010045442002","88888888",ccbAcc4,"2");
 98         Card ccbCard6 = new CreditCard("6640000010045442003","88888888",ccbAcc4,"2");
 99         Card icbcCard7 = new DebitCard("6222081502001312389","88888888",icbcAcc1,"1");
100         Card icbcCard8 = new DebitCard("6222081502001312390","88888888",icbcAcc2,"1");
101         Card icbcCard9 = new DebitCard("6222081502001312399","88888888",icbcAcc3,"1");
102         Card icbcCard10 = new DebitCard("6222081502001312400","88888888",icbcAcc3,"1");
103         Card icbcCard11 = new DebitCard("6222081502051320785","88888888",icbcAcc4,"1");
104         Card icbcCard12 = new DebitCard("6222081502051320786","88888888",icbcAcc5,"1");
105         Card icbcCard13 = new CreditCard("6640000010045441009","88888888",icbcAcc6,"2");
106         Card tabcCard14 = new CreditCard("6630000010033431001","88888888",tabcAcc1,"2");
107         Card tabcCard15 = new CreditCard("6630000010033431008","88888888",tabcAcc2,"2");
108         
109         ccbAcc1.addCard(ccbCard1);
110         ccbAcc1.addCard(ccbCard2);
111         ccbAcc2.addCard(ccbCard3);
112         ccbAcc3.addCard(ccbCard4);
113         ccbAcc4.addCard(ccbCard5);
114         ccbAcc4.addCard(ccbCard6);
115         icbcAcc1.addCard(icbcCard7);
116         icbcAcc2.addCard(icbcCard8);
117         icbcAcc3.addCard(icbcCard9);
118         icbcAcc3.addCard(icbcCard10);
119         icbcAcc4.addCard(icbcCard11);
120         icbcAcc5.addCard(icbcCard12);
121         icbcAcc6.addCard(icbcCard13);
122         tabcAcc1.addCard(tabcCard14);
123         tabcAcc2.addCard(tabcCard15);
124         //Account account =Account.getAmountbyCardNO("6222081502001312390");
125         //System.out.print(account.getUser().getName());
126         StringBuilder sb = new StringBuilder();
127         
128         String data;
129         
130         while(!((data = input.nextLine()).equals("#"))) {
131             sb.append(data + "\n");
132         }        
133         
134         String[] dt = sb.toString().split("\n");
135         for(int i = 0; i < dt.length; i++) {
136             String[] dataLine = dt[i].toString().split("\\s+");
137             
138             if(dataLine.length == 1) {//如果只有一个数据则为查询余额
139                 GetBalance gb = new GetBalance(unionPay);
140                 System.out.println("业务:查询余额 "+String.format("¥%.2f", gb.getBalance(dataLine[0])));
141             }else {//否则则为进行业务操作
142                 Withdraw wd = new Withdraw(unionPay,dataLine[0],dataLine[1],dataLine[2],Double.parseDouble(dataLine[3]));
143                 wd.withdraw();
144             }
145         }       
146     }
147 }
148 
149 class Bank {
150     private String bankNO;
151     private String bankName;
152     private double serviceCharge;//手续费
153     private ArrayList<Account> accountList = new ArrayList<Account>();
154     private ArrayList<ATM> ATMList = new ArrayList<ATM>();
155 
156     public Bank() {
157         super();
158         // TODO Auto-generated constructor stub
159     }
160 
161     public Bank(String bankNO, String bankName,double serviceCharge) {
162         super();
163         this.bankNO = bankNO;
164         this.bankName = bankName;
165         this.serviceCharge=serviceCharge;
166     }
167 
168     public String getBankNO() {
169         return bankNO;
170     }
171 
172     public void setBankNO(String bankNO) {
173         this.bankNO = bankNO;
174     }
175 
176     public String getBankName() {
177         return bankName;
178     }
179 
180     public void setBankName(String bankName) {
181         this.bankName = bankName;
182     }
183 
184     public void addAccount(Account account) {
185         this.accountList.add(account);
186     }
187 
188     public void removeAccount(Account account) {
189         this.accountList.remove(account);
190     }
191     
192     public void addATM(ATM aTM) {
193         this.ATMList.add(aTM);
194     }
195     
196     public void removeATM(ATM aTM) {
197         this.ATMList.remove(aTM);
198     }
199 
200     public ArrayList<Account> getAccountList() {
201         return accountList;
202     }
203 
204     public void setAccountList(ArrayList<Account> accountList) {
205         this.accountList = accountList;
206     }
207 
208     public ArrayList<ATM> getATMList() {
209         return ATMList;
210     }
211 
212     public void setATMList(ArrayList<ATM> aTMList) {
213         ATMList = aTMList;
214     }
215 
216     public double getServiceCharge() {
217         return serviceCharge;
218     }
219 
220     public void setServiceCharge(double serviceCharge) {
221         this.serviceCharge = serviceCharge;
222     }
223 
224 }
225 
226 class User {//用户类
227     private String ID;
228     private String name;
229     private String Phone;
230     ArrayList<Account> list = new ArrayList<Account>();
231 
232     public User() {
233         super();
234         // TODO Auto-generated constructor stub
235     }    
236 
237     public User(String iD, String name, String phone) {
238         super();
239         ID = iD;
240         this.name = name;
241         Phone = phone;
242     }
243 
244     public String getID() {
245         return ID;
246     }
247 
248     public void setID(String iD) {
249         ID = iD;
250     }
251 
252     public String getPhone() {
253         return Phone;
254     }
255 
256     public void setPhone(String phone) {
257         Phone = phone;
258     }    
259 
260     public String getName() {
261         return name;
262     }
263 
264     public void setName(String name) {
265         this.name = name;
266     }
267 
268     public void addAccount(Account account) {
269         this.list.add(account);
270     }
271 
272     public void removeAccount(Account account) {
273         this.list.remove(account);
274     }
275 }
276 
277 abstract class Account {
278     private String accountNO;
279     private double balance = 0;
280     private User user = null;
281     private Bank bank = null;
282     private String accountType;
283     private static ArrayList<Card> list = new ArrayList<Card>();
284 
285     public void addCard(Card card) {
286         list.add(card);
287     }
288 
289     public void removeCard(Card card) {
290         list.remove(card);
291     }
292 
293     public double getBalance() {
294         return balance;
295     }
296 
297     public void setBalance(double balance) {
298         this.balance = balance;
299     }
300 
301     public String getAccountNO() {
302         return accountNO;
303     }
304 
305     public void setAccountNO(String accountNO) {
306         this.accountNO = accountNO;
307     }
308 
309     public User getUser() {
310         return user;
311     }
312 
313     public void setUser(User user) {
314         this.user = user;
315     }
316 
317     public Bank getBank() {
318         return bank;
319     }
320 
321     public void setBank(Bank bank) {
322         this.bank = bank;
323     }
324 
325     public ArrayList<Card> getList() {
326         return list;
327     }
328 
329     public void setList(ArrayList<Card> list) {
330         Account.list = list;
331     }
332     
333     public String getAccountType() {
334         return accountType;
335     }
336 
337     public void setAccountType(String accountType) {
338         this.accountType = accountType;
339     }
340 
341     public static Account getAmountbyCardNO(String cardNO) {
342         Iterator<Card> cardItr = Account.list.iterator();
343         Card card = null;
344         
345         while(cardItr.hasNext()) {
346             card = cardItr.next();
347             if(card.getCardNO().equals(cardNO)) {
348                 return card.getAccount();
349             }
350         }
351         
352         return null;
353     }
354 }
355 class DebitAccount extends Account{//借记账户继承于账户
356     public DebitAccount() {
357         
358     }
359     public DebitAccount(String accountNO, double balance, User user, Bank bank,String accountType) {
360         this.setAccountNO(accountNO);
361         this.setBalance(balance);
362         this.setUser(user);
363         this.setBank(bank);
364         this.setAccountType(accountType);
365     }
366 }
367 class CreditAccount extends Account{信用账户继承账户
368     public CreditAccount() {
369         
370     }
371     public CreditAccount(String accountNO, double balance, User user, Bank bank,String accountType) {
372         this.setAccountNO(accountNO);
373         this.setBalance(balance);
374         this.setUser(user);
375         this.setBank(bank);
376         this.setAccountType(accountType);
377     }
378 }
379 abstract class Card {//抽象类卡
380     private String cardNO;
381     private String cardPassword;
382     private String cardType;
383     private Account account = null;
384 
385     public String getCardNO() {
386         return cardNO;
387     }
388 
389     public void setCardNO(String cardNO) {
390         this.cardNO = cardNO;
391     }
392 
393     public String getCardPassword() {
394         return cardPassword;
395     }
396 
397     public Account getAccount() {
398         return account;
399     }
400 
401     public void setAccount(Account account) {
402         this.account = account;
403     }
404 
405     public void setCardPassword(String cardPassword) {
406         this.cardPassword = cardPassword;
407     }
408 
409     public boolean checkCard() {//检验卡号是否为十六位数字
410         Pattern p = Pattern.compile("\\d{16}+");
411         Matcher m = p.matcher(this.cardNO);
412         return m.matches();
413     }
414 
415     public boolean checkPassword(String password) {
416         return this.cardPassword.equals(password);
417     }
418 
419     public String getCardType() {
420         return cardType;
421     }
422 
423     public void setCardType(String cardType) {
424         this.cardType = cardType;
425     }
426 
427   
428 }
429 class DebitCard extends Card{//借记卡类继承卡类
430     public DebitCard(){
431         
432     }
433     
434     public DebitCard(String cardNO, String cardPassword, Account account,String cardType) {
435         this.setCardNO(cardNO);
436         this.setCardPassword(cardPassword);
437         this.setAccount(account);
438         this.setCardType(cardType);
439     }
440     
441 }
442 class CreditCard extends Card{信用卡继承卡类
443     public CreditCard() {
444         
445     }
446     
447     public  CreditCard(String cardNO, String cardPassword, Account account,String cardType) {
448         this.setCardNO(cardNO);
449         this.setCardPassword(cardPassword);
450         this.setAccount(account);
451         this.setCardType(cardType);
452     }
453 
454 }
455 class ATM {
456     private String ATMID;
457     private Bank bank = null;
458 
459     public ATM() {
460         super();
461         // TODO Auto-generated constructor stub
462     }   
463 
464     public ATM(String aTMID, Bank bank) {
465         super();
466         ATMID = aTMID;
467         this.bank = bank;
468     }
469 
470     public String getATMID() {
471         return ATMID;
472     }
473 
474     public void setATMID(String aTMID) {
475         ATMID = aTMID;
476     }
477 
478     public Bank getBank() {
479         return bank;
480     }
481 
482     public void setBank(Bank bank) {
483         this.bank = bank;
484     }
485 }
486 
487 class Withdraw {//工具类取款
488     private UnionPay unionPay;
489     private String cardNO;
490     private String cardPassword;
491     private String ATMID;
492     private double amount;
493 
494     public Withdraw() {
495         super();
496         // TODO Auto-generated constructor stub
497     }
498     
499 
500     public Withdraw(UnionPay unionPay, String cardNO, String cardPassword, String aTMID, double amount) {
501         super();
502         this.unionPay = unionPay;
503         this.cardNO = cardNO;
504         this.cardPassword = cardPassword;
505         ATMID = aTMID;
506         this.amount = amount;
507     }
508     
509     public Withdraw(String cardNO, String cardPassword, String aTMID, double amount) {
510         super();
511         this.cardNO = cardNO;
512         this.cardPassword = cardPassword;
513         ATMID = aTMID;
514         this.amount = amount;
515     }
516 
517 
518     public void withdraw() {
519         /**
520          * 校验该卡是否存在
521          */        
522         Card card = ValidateData.getCardbyCardNO(unionPay, cardNO);
523         if(card == null) {
524             System.out.println("Sorry,this card does not exist.");
525             System.exit(0);
526         }
527         
528         /**
529          * 校验ATM是否存在
530          */
531         ATM aTM = ValidateData.getATMbyATMID(unionPay, ATMID);
532         if(aTM == null) {
533             System.out.println("Sorry,the ATM's id is wrong.");
534             System.exit(0);
535         }
536         
537         Account account = Account.getAmountbyCardNO(cardNO);
538         double balance = account.getBalance();
539         
540         /**
541          * 校验卡密码是否正确
542          */
543         if(!card.getCardPassword().equals(cardPassword)) {
544             System.out.println("Sorry,your password is wrong.");
545             System.exit(0);
546         }
547         
548         /**
549          * 校验取款金额是否大于余额
550          */
551         if (amount > balance&&account.getAccountType().equals("1")) {
552             System.out.println("Sorry,your account balance is insufficient.");
553             System.exit(0);
554         }
555         
556         /**
557          * 校验是否为跨行取款
558          */
559         if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) {
560             //System.out.println("Sorry,cross-bank withdrawal is not supported.");
561             if( balance>=amount)
562             account.setBalance((balance - amount*(1+aTM.getBank().getServiceCharge())));//取款更新余额操作
563             else {
564                 if(balance>=0&&balance<amount)
565                 account.setBalance((balance - amount*(1+aTM.getBank().getServiceCharge())-(amount-balance)*unionPay.getOverdraftservicecharge()));
566                 else
567                 account.setBalance((balance - amount*(1+aTM.getBank().getServiceCharge())-amount*unionPay.getOverdraftservicecharge()));
568             }
569         }    
570         else {
571             if( balance>=amount)
572                 account.setBalance((balance - amount));//取款更新余额操作
573             else {
574                 if(balance>=0&&balance<amount)
575                 account.setBalance((balance - amount-(amount-balance)*unionPay.getOverdraftservicecharge()));
576                 else
577                 account.setBalance((balance - amount-amount*unionPay.getOverdraftservicecharge()));
578             }
579         }
580         //检验信用卡是否透支最大金额
581         if(account.getBalance()<unionPay.getMaximumoverdraftlimit()||(account.getAccountType().equals("1")&&account.getBalance()<0)) {
582             System.out.println("Sorry,your account balance is insufficient.");
583             System.exit(0);
584         }
585         if(amount >= 0) {
586             showResult(account,1);
587         }else {
588             showResult(account,0);
589         }
590         
591     }
592     
593     public void showResult(Account account,int flag) {
594         ATM aTM = ValidateData.getATMbyATMID(unionPay, ATMID);
595         String type = "";
596         if(flag == 1) {
597             type = "取款";            
598         }else {
599             type = "存款";
600             amount *= -1;
601         }
602         String userName = account.getUser().getName();
603         String bankName = aTM.getBank().getBankName();
604         System.out.println("业务:"+type+" "+userName + "在" +
605                 bankName + "的" + ATMID + "号ATM机上" + type + String.format("¥%.2f", amount));
606                 System.out.println("当前余额为" + String.format("¥%.2f", account.getBalance()));
607     }
608 }
609 
610 class ValidateData {
611     /**
612      * 校验卡号是否存在
613      * @param unionPay
614      * @param cardNO
615      * @return
616      */
617     public static Card getCardbyCardNO(UnionPay unionPay,String cardNO) {
618         Card card = null;
619         Iterator<Bank> bankItr = unionPay.getBankList().iterator();
620         
621         while(bankItr.hasNext()) {
622             ArrayList<Account> accountList = bankItr.next().getAccountList();
623             Iterator<Account> accountItr = accountList.iterator();
624             while(accountItr.hasNext()) {
625                 ArrayList<Card> cardList = accountItr.next().getList();
626                 Iterator<Card> cardItr = cardList.iterator();
627                 while(cardItr.hasNext()) {
628                     card = cardItr.next();
629                     if(card.getCardNO().equals(cardNO)) {
630                         return card;
631                     }
632                 }
633             }
634         }
635         return null;
636     }
637     
638     /**
639      * 校验ATM ID是否存在
640      * @param unionPay
641      * @param ATMID
642      * @return
643      */
644     public static ATM getATMbyATMID(UnionPay unionPay,String ATMID) {//并获得所需atm类
645         Iterator<Bank> bankItr = unionPay.getBankList().iterator();
646         Bank bank = null;
647         ATM aTM = null;
648         
649         while(bankItr.hasNext()) {
650             bank = bankItr.next();
651             Iterator<ATM> aTMItr = bank.getATMList().iterator();    
652             
653             while(aTMItr.hasNext()) {
654                 aTM = aTMItr.next();
655                 if(aTM.getATMID().equals(ATMID)) {
656                     return aTM;
657                 }
658             }            
659         }        
660         return null;    
661     }
662 }
663 
664 class UnionPay {
665     private double Overdraftservicecharge;
666     private double Maximumoverdraftlimit;
667     private ArrayList<Bank> bankList = new ArrayList<Bank>();
668 
669     public UnionPay() {
670         super();
671         // TODO Auto-generated constructor stub
672     }
673 
674     public UnionPay(double Overdraftservicecharge,double Maximumoverdraftlimit) {
675         super();
676         this.Overdraftservicecharge=Overdraftservicecharge;
677         this.Maximumoverdraftlimit=Maximumoverdraftlimit;
678     }
679     
680     public double getOverdraftservicecharge() {
681         return Overdraftservicecharge;
682     }
683 
684     public void setOverdraftservicecharge(double overdraftservicecharge) {
685         Overdraftservicecharge = overdraftservicecharge;
686     }
687 
688     public double getMaximumoverdraftlimit() {
689         return Maximumoverdraftlimit;
690     }
691 
692     public void setMaximumoverdraftlimit(double maximumoverdraftlimit) {
693         Maximumoverdraftlimit = maximumoverdraftlimit;
694     }
695 
696     public ArrayList<Bank> getBankList() {
697         return bankList;
698     }
699 
700     public void setBankList(ArrayList<Bank> bankList) {
701         this.bankList = bankList;
702     }
703     
704     public void addBank(Bank bank) {
705         this.bankList.add(bank);
706     }
707     
708     public void removeBank(Bank bank) {
709         this.bankList.remove(bank);
710     }    
711 }
712 
713 class GetBalance {
714     private UnionPay unionPay;
715     
716     public GetBalance() {
717         super();
718         // TODO Auto-generated constructor stub
719     }
720 
721     public GetBalance(UnionPay unionPay) {
722         super();
723         this.unionPay = unionPay;
724     }
725 
726     public double getBalance(String cardNO) {
727         return ValidateData.getCardbyCardNO(unionPay, cardNO).getAccount().getBalance();
728     }
729 }

类图

:

 

 

 

 8-1,9-1设计思路分析总结:

两次题目都是关于银行取钱问题,9-1在8-1的基础上进行问题迭代,在总结两次作业的相关性时发现

在创建类与类的关系前一定要搞明白类与类之间的关系,并清楚的知道用户需求,按照需求来进行

创建,确定好关系后要构造各自的方法,并做到单一职责原则,在碰到需要联系类与类的关系时应该

构建工具类来辅助完成.

 

三.采坑心得

 

在Main类中定义一个静态Scanner对象,这样在其它类中如果想要使用该对象进行输入,则直接

使用Main.input.next…即可(避免采坑)

 

 对于某泛型其中的一个或多个属性排序不能直接使用sort方法,需要重写Comparable接口中的compareTo方法

改正前代码图片:

 

 

改正后代码图片:

 

 总结:这次采坑处为知识上的漏洞,通过学习该知识后补上.

四.改进建议

 在老师的提示下发现自己构造的类的属性有问题,例如卡类里面没有卡的余额

以及卡的密码,这两个属性是在账户中的.

对于一些for循环语句中可以使用其他的进行循环例如迭代器进行list循环

逻辑推理要求更高跟需要细致的思考分类,代码规范继续规范改正

五.总结与分析

通过了这三次的题目集训练之后,我学到了很多,我理解到了类与类之间的关系,明白了聚合关系,继承关

系,理解了继承关系.而接口定义实现类构建和抽象类定义实体类构建,而两个方法分别是方法重载和方法

重写.写代码一定要严格遵守规则,不能乱写一通.这几次代码对于问题的解决而创建类去完成有了很大的

提升.

教学改进建议及意见:上课可以多讲些java知识.

posted @ 2021-06-20 16:58  hhblogs  阅读(98)  评论(0)    收藏  举报