题目集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图形名称2:面积值2 …图形名称n:面积值n,注意,各图形输出之间用空格分开,且输出最后存在一个用于分隔的空格; - 排序后的各图形类型及面积,格式同排序前的输出;
- 所有图形的面积总和,格式为
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知识.

浙公网安备 33010602011771号