java-7311练习(下)

时间:2022-09-05 21:31:39

java练习,仅供参考!

欢迎同学们交流讨论。

JDK 1.8 API帮助文档

JDK 1.6 API中文文档

第一次小组作业:模拟双色球彩票

第一次小组作业(一) 控制台版

java-7311练习(下)

游戏规则:

• 双色球为红球和蓝球

• 用户从1-33中自选6个数字(不能重复)代表红球;从1-16中自选1个数字代表蓝球;

上图为中奖规则,如一等奖为中6个红球及蓝球,二等奖为仅中6个红球……

• 请自拟六个奖项对应的奖品。

  1. package GroupFirst; 


  2. import java.util.Scanner; 


  3. /** 

  4. * 第一次小组作业:模拟双色球彩票  

  5. * •游戏规则 

  6. * •双色球为红球和蓝球 

  7. * •用户从1-33中自选6个数字(不重复)代表红球;从1-16中自选1个数字代表蓝球 

  8. * •上图为中奖规则,如一等奖为中6个红球及蓝球,二等奖为仅中6个红球…… 

  9. * •请自拟六个奖项对应的奖品 

  10. */ 

  11. public class Balllottery 



  12. private int[] betRedBall = new int[6];//存放选择的6个红球 

  13. private int betBlueBall; //存放选择的1个蓝球 

  14. private Scanner scan = null; //扫描器对象 

  15. private int[] winningRedBall = {1,2,3,4,5,6};//红球中奖号码 

  16. private int winningBlueBall = 7; //蓝球中奖号码 


  17. public static void main(String[] args) 



  18. Balllottery lottery = new Balllottery(); 


  19. //从1-33中自选6个数字(不重复)代表红球 

  20. lottery.seletRedBall();//lottery.seletRedBall(); 

  21. System.out.println("--------红球选择完成-----------"); 


  22. //从1-16中自选1个数字代表蓝球 

  23. lottery.seletBlueBall(); 

  24. System.out.println("--------蓝球选择完成-----------"); 


  25. //投注并开奖; 

  26. int level = lottery.lotteryBetting(); 


  27. //显示奖品;  

  28. lottery.showResults(level); 





  29. public void showResults(int level) 



  30. System.out.println("---------------------------"); 

  31. System.out.print("您的投注为:"); 

  32. for (int i = 0; i < betRedBall.length; i++) 

  33. System.out.printf("%-3d",betRedBall[i]); 

  34. System.out.print(", " + betBlueBall + "\n"); 


  35. System.out.print("开奖号码为:"); 

  36. for (int i = 0; i < winningRedBall.length; i++) 

  37. System.out.printf("%-3d",winningRedBall[i]); 

  38. System.out.print(", " + winningBlueBall + "\n\n"); 


  39. //根据中奖等级分配奖品 

  40. switch (level) 



  41. case 0: System.out.println("抱歉,您没中奖!"); break; 

  42. case 1: System.out.println("一等奖,恭喜您获得自行车一辆!"); break; 

  43. case 2: System.out.println("二等奖,恭喜您获得保温杯一个!"); break; 

  44. case 3: System.out.println("三等奖,恭喜您获得新书包一个!"); break; 

  45. case 4: System.out.println("四等奖,恭喜您获得记事本一个!"); break; 

  46. case 5: System.out.println("五等奖,恭喜您获得签字笔一个!"); break; 

  47. case 6: System.out.println("六等奖,恭喜您获得黑铅笔一个!"); break; 



  48. System.out.println("\n---------------------------"); 




  49. // 从1-33中自选6个数字(不重复)代表红球 

  50. public void seletRedBall() 



  51. //用一个数组来存放33个红球并赋值1-33号 

  52. int[] redBall = new int[33];  

  53. for (int i = 0; i < redBall.length; i++) 

  54. redBall[i] = i + 1; // 1--33 


  55. // used表示已经出现过的红球 ; boolean数组默认初始为false 

  56. boolean[] used = new boolean[redBall.length]; 


  57. int count = 0; //统计下注红球个数 


  58. // 输入6个不重复的红球号码,并存放到bet数组 

  59. //Scanner scan = null; 

  60. scan = new Scanner(System.in); 

  61. System.out.println("请输入6个红球号码(1-33):"); 


  62. while (scan.hasNext()) 



  63. int num = scan.nextInt(); // 获得输入 


  64. // 如果这个号码是1-33号,那么就重新选择 

  65. if (num < 1 || num > 33) 



  66. System.out.println("没有" 

  67. + num + "号,请选1-33号。您还需要选择" 

  68. + (6-count) +"个红球!"); 

  69. continue; 



  70. // 如果这个号码没有被选过,那么就放到bet数组 

  71. if (!used[num]) 



  72. betRedBall[count++] = num; 

  73. used[num] = true; 

  74. System.out.println("已选" 

  75. + num + "号!您还需要选择" 

  76. + (6-count) +"个红球!"); 



  77. else  



  78. System.out.println(num + "号已选过,您还需要选择" 

  79. + (6-count) +"个红球!"); 



  80. // 选完6个红球则跳出循环 

  81. if (count==6) break; 






  82. // 从1-16中自选1个数字代表蓝球  

  83. public void seletBlueBall() 



  84. // 输入1个蓝球号码 

  85. //Scanner scan = null; 

  86. scan = new Scanner(System.in); 

  87. System.out.print("请输入1个蓝球号码(1-16):"); 


  88. while (scan.hasNextLine()) 



  89. int num = scan.nextInt(); // 获得输入 

  90. // 

  91. // 如果这个号码是1-16号,那么就重新选择 

  92. if (num < 1 || num > 16) 



  93. System.out.println("没有" + num + "号,请选1-16号!"); 

  94. continue; 



  95. else 



  96. betBlueBall = num; 

  97. System.out.println("已选" + num + "号!"); 

  98. break; 








  99. // 投注并开奖 

  100. public int lotteryBetting() 



  101. int correctRedCount = 0; // 猜中的红球个数 

  102. boolean correctBlueCount = false; // 是否猜中篮球 


  103. //遍历选择的红球;对比开奖结果 算出中奖的红球个数 

  104. for (int i = 0; i < betRedBall.length; i++) 



  105. for (int j = 0; j < winningRedBall.length; j++) 



  106. if (betRedBall[i] == winningRedBall[j]) 



  107. correctRedCount++; 

  108. continue; 








  109. // 判断是否猜中蓝球 

  110. if (betBlueBall == winningBlueBall) correctBlueCount = true;  


  111. /** 没中奖 返回 0 

  112. * 一等奖 中 6+1 

  113. * 二等奖 中 6+0 

  114. * 三等奖 中 5+1 

  115. * 四等奖 中 5+0 中 4+1 

  116. * 五等奖 中 4+0 中 3+1 

  117. * 六等奖 中 2+1 中 0+1 中 1+1 

  118. */ 

  119. System.out.println("Debug:" 

  120. + correctRedCount + "," + correctBlueCount); 

  121. if (correctRedCount == 6) 



  122. if (correctBlueCount) return 1; 

  123. else return 2; 



  124. if (correctRedCount == 5) 



  125. if (correctBlueCount) return 3; 

  126. else return 4; 



  127. if (correctRedCount == 4) 



  128. if (correctBlueCount) return 4; 

  129. else return 5; 



  130. if (correctBlueCount) 



  131. if (correctRedCount == 3) return 5; 

  132. //else if (correctRedCount == 2) return 6; 

  133. //else if (correctRedCount == 1) return 6; 

  134. else return 6; 




  135. return 0; 





运行结果:

java-7311练习(下)

第一次小组作业(二) 界面版

-------------------------2016-11-23 更新

整体概况:

  • JPanel面板的的建立与更新

    窗口所有的组件都是绘制在JPanel上的,主要的变化来自于球的变化;(鼠标单击事件)获取的坐标定位到具体的,才方便操作球的变化;每一次的变化都要更新面板内容。

  • 开奖号码的绑定与设置

    开奖号码显示在一个JLabel标签中,这样JFrame窗体直接通过JLabel就获取开奖号码;开奖号码按钮可以设置开奖号码,而不(方便)用通过ControlBall控制球类获取。

  • 单击的变化与清空选择

    我是定义了(红蓝灰)3种类型的球,根据她们的状态来响应不同的颜色或号码;清空选择按钮是分别执行了模拟单个点击已选球的操作。

  • 优化与改进

    (1) 所有的绘制在JPanel上, 故绘制的坐标也是基于JPanel;而JPanel面板又被添加到JFrame窗体上,又因鼠标坐标却是基于JFrame窗体的;这两套坐标不一致,但却要用鼠标的坐标去定位球的坐标,球的坐标相对固定,而JPanel的零点相对JFrame窗体的零点却可能不一致,比如窗体边框发生变化时;两套坐标的对应是个问题,我这里只是用到当前状态的相对差距(9,30),如果窗体发生变化,可能就会不能对应坐标,这样也就会产生 选球“失灵”的情况。

    (2) 设置开奖号码我这里只做了范围判断,并没有做重复判断,算是个小Bug。

    (3) 这里用的的是鼠标响应时间,加上代码可能效率不高,这样不可避免的有延时;其实这里的所有的球可以换作按钮,这样通过组件操作必然方便准确,这样只需重点考虑按钮美观的问题。

运行演示: 我这里已经打包可直接运行(需要jdk环境), 点击下载 .Jar

java-7311练习(下)

目录结构: 共享的源码只有5个类,有兴趣调试的可以参考此目录。

java-7311练习(下)

源码共享: 代码比较长,不在这里贴码了,有兴趣的同学可以点击下载 .rar

week7 Cylinder(二)

2个文件 cylinder_1.dat, cylinder_0.dat都放在项目根目录的resource包下,内容如下:

java-7311练习(下)

7.1 Cylider.java

  1. package week7; 


  2. import java.text.DecimalFormat; 


  3. /** 

  4. * 7.1 创建 Cylinder类,以存储标签、半度; 

  5. * 方法包括获得及设置这些成员变量,计算直径、周长面积及体积。  

  6. */ 

  7. public class Cylinder 



  8. private String lable; //存储标签 

  9. private double radius; //圆柱半径 

  10. private double height; //圆柱的高 

  11. public Cylinder(String lable, double radius, double height) 



  12. this.lable = lable; 

  13. this.radius = radius; 

  14. this.height = height; 




  15. public String getLable() 



  16. return lable; 




  17. public boolean setLable(String lable) 



  18. boolean flag = true; 


  19. if (lable.isEmpty()) flag = false; 

  20. else this.lable = lable.trim(); 

  21. //String.trim()截去字符串开头和末尾的空白 

  22. return flag; 




  23. public double getRadius() 



  24. return radius; 




  25. public void setRadius(double radius) 



  26. this.radius = radius; 




  27. public double getHeight() 



  28. return height; 




  29. public void setHeight(double height) 



  30. this.height = height; 




  31. //返回圆柱底面直径 

  32. public double diameter() 



  33. return radius * 2; 




  34. //返回圆柱底面周长 

  35. public double circumference() 



  36. return diameter() * Math.PI; 




  37. //返回 表面积 = 圆柱底面积×2 + 底面周长×高 

  38. public double area() 



  39. return Math.PI * radius * radius * 2 

  40. + circumference() * height; 




  41. //返回 圆柱底体积 

  42. public double volumn() 



  43. return Math.PI * radius * radius * height; 




  44. @Override 

  45. public String toString() 



  46. String output = null; 

  47. DecimalFormat df = new DecimalFormat("#,##0.0##"); 

  48. output = lable 

  49. + " is a cylinder with radius = " + df.format(radius) 

  50. + " units and height = " + df.format(height) 

  51. + " units, " 

  52. + "\nwhich has diameter = " + df.format(diameter()) 

  53. + " units, circumference = " + df.format(circumference()) 

  54. + " units, " 

  55. + "\narea = " + df.format(area()) 

  56. + " square units, and volume = " + df.format(volumn()) 

  57. + " cubic units.\n"; 

  58. return output; 




  59. public static void main(String[] args) 



  60. Cylinder c1 = new Cylinder("Small Example", 4.0, 10.0); 

  61. Cylinder c2 = new Cylinder("Medium Example", 22.1, 30.6); 

  62. Cylinder c3 = new Cylinder("Large Example", 100.0, 200.0); 

  63. c1.setLable(""); 

  64. System.out.println(c1); 

  65. System.out.println(c2); 

  66. System.out.println(c3); 






7.2 CylinderList.java

  1. package week7; 


  2. import java.text.DecimalFormat; 

  3. import java.util.ArrayList; 


  4. /** 

  5. * 7.2 CylinderList类  

  6. */ 

  7. public class CylinderList 



  8. private String listName; 

  9. private ArrayList<Cylinder> cList; 


  10. CylinderList(String listName, ArrayList<Cylinder> cList) 



  11. this.listName = listName; 

  12. this.cList = cList; 




  13. //返回一个代表几何名字的字符串 

  14. public String getName() 



  15. return listName; 




  16. //返回代表集合中Cylinder对象的个数 

  17. public int numberOfCylinders() 



  18. return cList.size(); 




  19. //返回 所有的Cylinder对象的 高 的和 

  20. public double totalHeight() 



  21. double totalHeight = 0; 

  22. for (Cylinder cylinder : cList) 



  23. totalHeight += cylinder.getHeight(); 



  24. return totalHeight; 




  25. //返回 所有的Cylinder对象的 圆柱底面直径 的和 

  26. public double totalDiameter() 



  27. double totalDiameter = 0; 

  28. for (Cylinder cylinder : cList) 



  29. totalDiameter += cylinder.diameter(); 



  30. return totalDiameter; 




  31. //返回 所有的Cylinder对象的 面积 之和 

  32. public double totalArea() 



  33. double totalArea = 0; 

  34. for (Cylinder cylinder : cList) 



  35. totalArea += cylinder.area(); 



  36. return totalArea; 




  37. //返回 所有的Cylinder对象的 体积 之和 

  38. public double totalVolume() 



  39. double totalVolume = 0; 

  40. for (Cylinder cylinder : cList) 



  41. totalVolume += cylinder.volumn(); 



  42. return totalVolume; 




  43. //返回 所有的Cylinder对象 面积 的 平均值 

  44. public double averageArea() 



  45. double averageArea = 0; 

  46. if (cList.size()>0) 



  47. averageArea = totalArea()/cList.size(); 



  48. return averageArea; 




  49. //返回 所有的Cylinder对象 体积 的 平均值 

  50. public double averageVolume() 



  51. double averageVolume = 0; 

  52. if (cList.size()>0) 



  53. averageVolume = totalVolume()/cList.size(); 



  54. return averageVolume; 




  55. //返回 集合的名字及集合中每一个对象的toString方法 

  56. public String toString() 



  57. String output = "\n" + listName + "\n\n"; 

  58. for (Cylinder cylinder : cList) 



  59. output += (cylinder.toString() + "\n");  



  60. return output; 




  61. //返回 集合的名字及Cylinder对象个数, 

  62. //总面积,总体积,平均面积及平均体积 

  63. public String summaryInfo() 



  64. String output = null; 

  65. DecimalFormat df = new DecimalFormat("#,##0.0##"); 

  66. output = "-----" + listName + " Summary-----" 

  67. + "\nNimber of Cylinders: " + numberOfCylinders() 

  68. + "\nTotal Area: " + df.format(totalArea()) 

  69. + "\nTotal Volume: " + df.format(totalVolume()) 

  70. + "\nTotal Height: " + df.format(totalHeight()) 

  71. + "\nTotal Diameter: " + df.format(totalDiameter()) 

  72. + "\nAverage Area: " + df.format(averageArea()) 

  73. + "\nAverage Volume: " + df.format(averageVolume()); 

  74. return output; 





7.3 CylinderListApp 测试类

  1. package week7; 


  2. import java.io.File; 

  3. import java.io.FileNotFoundException; 

  4. import java.util.ArrayList; 

  5. import java.util.Scanner; 


  6. /** 

  7. * 7.3 CylinderListApp 测试类 

  8. * (a) 打开用户输入的文件并读取第一行作为集合的名字;之后读取其他行, 

  9. * 依次生成Cylinder对象,最后生成CylinderList对象。 

  10. * (b) 输出CylinderList对象(调用toString方法),之后空一行, 

  11. * (c) 输出CylinderList对象的汇总信息(调用summaryInfo方法) 

  12. * 注意: 

  13. * 1)如果输入文件名后出现错误称找不到文件,此时可输出绝对路径 

  14. * 2)读取文件第一行作为集合名称后,使用以scanFile.hasNext() 

  15. * 为条件的while循环反复读入三行,然后创建Cylinder对象 

  16. * 3)输出结果必须与下面测试输出的结果完全一致 

  17. */ 

  18. public class CyliderListApp 



  19. public static void main(String[] args) throws FileNotFoundException 



  20. String lable; 

  21. double radius; 

  22. double height; 

  23. Scanner scan0 = new Scanner(System.in); 

  24. Scanner scan1 = null; 

  25. Scanner inputStream = null; 


  26. ArrayList<Cylinder> cList = new ArrayList<>(10); 

  27. CylinderList cylinderList = null;//new CylinderList(listName, cList) 


  28. System.out.print("Enter file name: "); 

  29. String fileName = scan0.nextLine(); // cylinder_0.dat 

  30. scan0.close(); 


  31. File file = new File("resource/" + fileName); 

  32. if(file.exists()) 



  33. inputStream = new Scanner(file); 


  34. String listName = inputStream.nextLine(); 

  35. while (inputStream.hasNextLine()) 



  36. String line = inputStream.nextLine(); 

  37. //使用逗号分隔line,例:Small Example, 4.0, 10.0 

  38. scan1 = new Scanner(line); 

  39. scan1.useDelimiter(","); 

  40. if (scan1.hasNext()) 



  41. lable = scan1.next(); 

  42. radius = Double.parseDouble(scan1.next()); 

  43. height = Double.parseDouble(scan1.next()); 

  44. //创建Cylinder对象并加入ArrayList<Cylinder>中 

  45. cList.add(new Cylinder(lable, radius, height)); 



  46. scan1.close(); //就近原则,以免出现空指针 



  47. inputStream.close(); 

  48. //初始化CylinderList对象 

  49. cylinderList = new CylinderList(listName, cList); 

  50. System.out.print(cylinderList.toString()); 

  51. System.out.println(cylinderList.summaryInfo()); 



  52. else 



  53. System.out.println(file.getAbsolutePath()); 








运行结果:

java-7311练习(下)
java-7311练习(下)

week8 Cylinder(三)

-------------------------2016-11-27更新

8.1 Cylider.java

导入使用的是7.1的Cylinder 类

8.2 CylinderList.java

参照 7.2 ;我这里贴出增加的部分;

  1. package week8; 


  2. import java.io.File; 

  3. import java.io.FileNotFoundException; 

  4. import java.text.DecimalFormat; 

  5. import java.util.ArrayList; 

  6. import java.util.Scanner; 


  7. import week7.Cylinder; 


  8. /** 

  9. * 8.2 同7.2 CylinderList类,只是增加了4个方法 

  10. */ 

  11. public class CylinderList 



  12. private String listName = null; 

  13. private Scanner scan = null; 

  14. private Scanner inputStream = null;  

  15. private ArrayList<Cylinder> cList = null; 


  16. /** 

  17. *  

  18. * @param listName 

  19. * @param cList 

  20. */ 

  21. CylinderList(String listName, ArrayList<Cylinder> cList) 



  22. this.listName = listName; 

  23. this.cList = cList; 



  24. /***************************以下为新增方法***********************************/ 

  25. /** 

  26. * 接收一个代表文件名字的字符串参数,读入文件内容将其存储到集合名字变量及 ArrayList类型的集合变量中; 

  27. * 利用集合名字及集合变量生成 CylinderList对象;最后返回该 CylinderList对象; 

  28. * @param fileName 

  29. * @return 

  30. * @throws FileNotFoundException 

  31. */ 

  32. public CylinderList readFile(String fileName) throws FileNotFoundException 



  33. CylinderList cylinderList = null; 

  34. String lable;  

  35. double radius;  

  36. double height; 

  37. String nameList = null; 


  38. //读文件并赋值 

  39. File file = new File(fileName);  

  40. if(file.exists())  

  41. {  

  42. inputStream = new Scanner(file);  


  43. nameList = inputStream.nextLine();  

  44. while (inputStream.hasNextLine())  

  45. {  

  46. String line = inputStream.nextLine();  

  47. //使用逗号分隔line,例:Small Example, 4.0, 10.0  

  48. scan = new Scanner(line);  

  49. scan.useDelimiter(",");  

  50. if (scan.hasNext())  

  51. {  

  52. lable = scan.next();  

  53. radius = Double.parseDouble(scan.next());  

  54. height = Double.parseDouble(scan.next());  

  55. //创建Cylinder对象并加入ArrayList<Cylinder>中  

  56. cList.add(new Cylinder(lable, radius, height));  





  57. cylinderList = new CylinderList(nameList, cList); 

  58. }  

  59. else  

  60. {  

  61. System.out.println(file.getAbsolutePath());  

  62. System.out.println(fileName + " not exists!"); 




  63. return cylinderList; 




  64. /** 

  65. * 添加一个Cylinder对象到CylinderList对象中 

  66. * @param label 

  67. * @param radius 

  68. * @param height 

  69. */ 

  70. public void addCylinder(String label, double radius, double height) 



  71. cList.add(new Cylinder(label, radius, height)); 




  72. /** 

  73. * 接收一个代表 Cylinder的 label值的字符串,如果在 CylinderList对象中找到了该对象,则返回该对象并删除之; 

  74. * 否则返回 null; 

  75. * @param label 

  76. * @return 

  77. */ 

  78. public Cylinder deleteCylinder(String label) 



  79. Cylinder cylinder = null; 

  80. for (int i = 0; i < cList.size(); i++) 



  81. //如果找到 先赋值 后 删除 

  82. if (cList.get(i).getLable().equalsIgnoreCase(label) == true) 



  83. cylinder = cList.get(i); 

  84. cList.remove(i); 





  85. return cylinder; 




  86. /** 

  87. * 参数接收收一个代表 Cylinder的 label值的字符串,如果在 CylinderList对象中找到了该对象, 

  88. * 则返回该对象;否则返回 null; 

  89. * @param label 

  90. * @return 

  91. */ 

  92. public Cylinder findCylinder(String label) 



  93. Cylinder cylinder = null; 

  94. for (int i = 0; i < cList.size(); i++) 



  95. //如果找到 赋值 

  96. if (cList.get(i).getLable().equalsIgnoreCase(label) == true) 



  97. cylinder = cList.get(i); 





  98. return cylinder; 



  99. /** 

  100. * String类中两个方法的比较: 

  101. * equals:将此字符串与指定的对象比较。当且仅当该参数不为 null, 

  102. * 并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。  

  103. * equalsIgnoreCase:将此 String 与另一个 String 比较,不考虑大小写。如果两个字符串的长度相同, 

  104. * 并且其中的相应字符都相等(忽略大小写),则认为这两个字符串是相等的。  

  105. */ 

  106. /***************************以上为新增方法*********************************/ 


  107. .... 



8.3 CylinderListMenuApp.java

  1. package week8; 


  2. import java.io.IOException; 

  3. import java.util.ArrayList; 

  4. import java.util.Scanner; 


  5. import week7.Cylinder; 


  6. /** 

  7. * 8.3 CylinderListMenuApp 

  8. * 包含 main 方法,呈现有 7 个选项的菜单 

  9. * (1) 读入文件内容并创建 CylinderList对象 

  10. * (2) 打印输出 CylinderList对象 

  11. * (3) 打印输出 CylinderList对象的汇总信息 

  12. * (4) 增加一个 CylinderList对象至 CylinderList对象中 

  13. * (5) 从 CylinderList对象中删除一个 Cylinder对象 

  14. * (6) 在 CylinderList对象中找到一个 Cylinder对象 

  15. * (7) 退出程序 

  16. * 设计: 

  17. * main方法中将先输出带有描述的 7个选项信息。 

  18. * 一旦用户输入了一个选项编号,则对应 的方法将被调用。 

  19. * 之后再次呈现选项信息,提示用户进行选择。 

  20. */ 

  21. public class CylinderListMenuApp 



  22. /** 

  23. * 显示菜单信息 

  24. */ 

  25. private static void showMenu() 



  26. //输出带有描述的 7个选项信息 

  27. System.out.println("Cylinder List System Menu"); 

  28. System.out.println("R - ReadFile and Create Cylinder List"); 

  29. System.out.println("P - Print Cylinder List"); 

  30. System.out.println("S - Print Summary"); 

  31. System.out.println("A - Add Cylinder"); 

  32. System.out.println("D - Delete Cylinder"); 

  33. System.out.println("F - Find Cylinder"); 

  34. System.out.println("Q - Quit"); 




  35. public static void main(String[] args) throws IOException 



  36. //创建一个 Cylinder集合 

  37. ArrayList<Cylinder> clist = new ArrayList<>(); 


  38. String sName = "***no list name assigned***"; 

  39. CylinderList cylinderList = new CylinderList(sName, clist); 



  40. Scanner scan = new Scanner(System.in); 

  41. char key; //输入的key值 


  42. showMenu(); //显示提示菜单 

  43. while (true) 



  44. //提示用户进行选择 

  45. System.out.print("\nEnter Code [R, P, S, A, D, F or Q]: "); 


  46. key = scan.nextLine().charAt(0); 

  47. switch (key) 



  48. case 'r'://resource/cylinder_1.dat 

  49. case 'R'://ReadFile and Create Cylinder List 

  50. System.out.print("\tFile name: "); 

  51. //读文件转化为CylinderList对象后重新赋值 

  52. cylinderList = cylinderList.readFile(scan.nextLine()); 

  53. System.out.println("\tFile read in and Cylinder List created"); 

  54. break; 

  55. case 'p': 

  56. case 'P'://Print Cylinder List 

  57. System.out.println(cylinderList); 

  58. break; 

  59. case 's': 

  60. case 'S'://Print Summary 

  61. System.out.println(cylinderList.summaryInfo()); 

  62. break; 

  63. case 'a': 

  64. case 'A'://Add Cylinder 

  65. System.out.print("\tLabel: "); 

  66. String labelA = scan.nextLine(); 

  67. System.out.print("\tRadius: "); 

  68. double radius = Double.parseDouble(scan.nextLine()); 

  69. System.out.print("\tHeight: "); 

  70. double height =Double.parseDouble(scan.nextLine()); 

  71. cylinderList.addCylinder(labelA, radius, height); 

  72. System.out.println("\t*** Cylinder added ***"); 

  73. break; 

  74. case 'd': 

  75. case 'D'://Delete Cylinder 

  76. System.out.print("\tLabel: "); 

  77. String labelD = scan.nextLine(); 

  78. if(cylinderList.deleteCylinder(labelD) == null) 

  79. System.out.println("\t\"" + labelD + "\" not found"); 

  80. else 

  81. System.out.println("\t\"" + labelD +"\" deleted"); 

  82. break; 

  83. case 'f': 

  84. case 'F'://Find Cylinder 

  85. System.out.print("\tLabel: "); 

  86. String labelF = scan.nextLine(); 

  87. if(cylinderList.findCylinder(labelF) == null) 

  88. System.out.println("\t\"" + labelF + "\" not found"); 

  89. else 

  90. System.out.println(cylinderList.findCylinder(labelF)); 

  91. break; 

  92. case 'q': 

  93. case 'Q'://Quit 

  94. return; 

  95. default: 

  96. System.out.println("\t*** invalid code ***"); 









运行演示:

java-7311练习(下)

week10 继承特性的练习: 货物

-------------------------2016-12-04更新

  • 谨记:重载增加了一个额外的方法,而覆盖取代了方法定义

  • 静态方法不能使用隐含(或明确的把this作为其调用对象) 的实例变量(或非静态方法)

  • java-7311练习(下)

10.1 InventoryItem.java

  1. package week10; 


  2. /** 

  3. * 10.1 InventoryItem.java 

  4. * 货物类:所有物品类的基类 

  5. */ 

  6. public class InventoryItem 



  7. protected String name; 

  8. protected double price; 

  9. private static double taxRate = 0; 


  10. public static void main(String[] args) 



  11. InventoryItem.setTaxRate(0.08); 

  12. InventoryItem item1 = new InventoryItem("Birdseed", 7.99); 

  13. InventoryItem item2 = new InventoryItem("Picture", 10.99); 


  14. System.out.println(item1); 

  15. System.out.println(item2); 




  16. /** 

  17. * 初始化 

  18. * @param name 

  19. * @param price 

  20. */ 

  21. public InventoryItem(String name, double price) 



  22. this.name = name; 

  23. this.price = price; 




  24. @Override 

  25. public String toString() 



  26. return name + ": $" + calculateCost(); 




  27. /** 

  28. * 货物含税的价格 

  29. * @return 

  30. */ 

  31. public double calculateCost() 



  32. return this.price * (1 + taxRate); 




  33. public String getName() 



  34. return name; 




  35. /** 

  36. * 设置税率; 

  37. * 静态方法不能使用隐含(或明确的把this作为其调用对象) 的实例变量(或非静态方法) 

  38. * @param taxRateIn 

  39. */ 

  40. public static void setTaxRate(double taxRateIn) 



  41. taxRate = taxRateIn; 





运行结果:

java-7311练习(下)

10.2 ElectronicsItem.java

  1. package week10; 


  2. /** 

  3. * 10.2 ElectronicsItem.java 

  4. * 电子货物类:InventoryItem的派生类 

  5. */ 

  6. public class ElectronicsItem extends InventoryItem 



  7. protected double weight; //电子货物重量 

  8. public static final double SHIPPING_COST = 1.5;//每磅的货运费用 


  9. public ElectronicsItem(String name, double price, double weight) 



  10. super(name, price); 

  11. this.weight = weight; 




  12. @Override 

  13. public double calculateCost() 



  14. return super.calculateCost() + weight * SHIPPING_COST; 




  15. public static void main(String[] args) 



  16. InventoryItem.setTaxRate(0.08); 

  17. ElectronicsItem eItem = new ElectronicsItem("Monitor", 100, 10.0); 

  18. System.out.println(eItem); 






运行结果:

java-7311练习(下)

10.3 OnlineTextItem.java

  1. package week10; 


  2. /** 

  3. * 10.3 OnlineTextItem.java 

  4. * 在线文本商品类:InventoryItem的派生类 

  5. * 该类代表用户可购买的在线文本商品(如电子书或者电子杂志); 

  6. * 因为它只是概念级的、 代表物品的类,因此可以设置为抽象类; 

  7. */ 

  8. public abstract class OnlineTextItem extends InventoryItem 




  9. public OnlineTextItem(String name, double price) 



  10. super(name, price); 

  11. // TODO Auto-generated constructor stub 




  12. @Override 

  13. public double calculateCost() 



  14. return price; 







10.4 OnlineArticle.java

  1. package week10; 


  2. /** 

  3. * 10.4 OnlineArticle.java 

  4. * 电子类文本物品:OnlineTextItem的派生类 

  5. */ 

  6. public class OnlineArticle extends OnlineTextItem 



  7. private int wordCount; //记录字数 


  8. public OnlineArticle(String name, double price) 



  9. super(name, price); 

  10. this.wordCount = 0; 




  11. @Override 

  12. public String toString() 



  13. return name + ": $"+ price  

  14. + " " + this.wordCount;  




  15. public void setWordCount(int wordCount) 



  16. this.wordCount = wordCount; 







10.5 OnlineBook.java

  1. package week10; 


  2. /** 

  3. * 10.5 OnlineBook.java 

  4. * 电子书:OnlineTextItem的派生类 

  5. */ 

  6. public class OnlineBook extends OnlineTextItem 



  7. protected String author; //电子书作者 


  8. public OnlineBook(String name, double price) 



  9. super(name, price); 

  10. author = "Author Not Listed"; 




  11. public void setAuthor(String author) 



  12. this.author = author; 




  13. @Override 

  14. public String toString() 



  15. return name + " - " 

  16. + author +": $" + price; 




  17. public static void main(String[] args) 



  18. OnlineBook book = new OnlineBook("A Novel Novel", 9.99); 

  19. System.out.println(book); 


  20. book.setAuthor("Jane Lane"); 

  21. System.out.println(book); 







运行结果:

java-7311练习(下)

10.6 InventoryApp.java

  1. package week10; 


  2. /** 

  3. * 10.6 InventoryApp.java 

  4. * 测试类: 

  5. * (1) 设置税率为 0.05 

  6. * (2) 初始化并输出 4个对象(item1、item2、item3、item4) 

  7. */ 

  8. public class InventoryApp 



  9. public static void main(String[] args) 



  10. InventoryItem.setTaxRate(0.05); 


  11. InventoryItem item1 = new InventoryItem("pen", 25); 

  12. ElectronicsItem item2 = new ElectronicsItem("apple phone", 1000, 1.8); 

  13. OnlineArticle item3 = new OnlineArticle("Java", 8.5); 

  14. OnlineBook item4 = new OnlineBook("Head first Java", 40); 


  15. item3.setWordCount(700); 

  16. item4.setAuthor("Kathy&Bert"); 


  17. System.out.println(item1); 

  18. System.out.println(item2); 

  19. System.out.println(item3); 

  20. System.out.println(item4); 


  21. System.out.println("All inventory:\n\n" + myItems); 

  22. System.out.println("Total: " + myItems.calculateTotal(2)); 






运行结果:

java-7311练习(下)

week11 继承的多态特性:货物列表

-------------------------2016-12-05更新

任务:在week10的基础上完成该实验任务。生成2个新的类,并体会继承的多态特性。

java-7311练习(下)

11.7 ItemsList.java

  1. package week11; 


  2. import week10.ElectronicsItem; 

  3. import week10.InventoryItem; 


  4. /** 

  5. * 11.7 ItemsList.java 

  6. * 存放InventoryItem对象的数组 

  7. */ 

  8. public class ItemsList 



  9. private InventoryItem[] inventory; 

  10. private int count; 


  11. public ItemsList() 



  12. inventory = new InventoryItem[20]; 

  13. count = 0; 




  14. /** 

  15. * 增加一个item 

  16. * @param itemIn 

  17. */ 

  18. public void addItem(InventoryItem itemIn) 



  19. this.inventory[count++] = itemIn; 




  20. /** 

  21. * 返回代表数组各元素价格的总和 

  22. * @param electronicsSurcharge,代表征收ElectronicsItem的附加费 

  23. * @return 

  24. */ 

  25. public double calculateTotal(double electronicsSurcharge) 



  26. double totalCost = 0; 


  27. /** 需要遍历 inventory数组的每一个元素,将价格 (cost)累加到和上。 

  28. * 如果元素为 ElectronicsItem类的引用变量 ,则激活calculateCost方法, 

  29. * 增加该的 方法的electronicsSurcharge 

  30. */ 

  31. for (int i = 0; i < count; i++) 



  32. if (inventory[i] instanceof ElectronicsItem) 



  33. totalCost += inventory[i].calculateCost() + electronicsSurcharge; 



  34. else 



  35. totalCost += inventory[i].calculateCost(); 






  36. return totalCost; 




  37. @Override 

  38. public String toString() 



  39. String output = ""; 

  40. for (int i = 0; i < count; i++) 



  41. output += inventory[i].toString(); 

  42. output += "\n"; 



  43. return output; 





11.8 ItemsListApp.java

  1. package week11; 


  2. import week10.ElectronicsItem; 

  3. import week10.InventoryItem; 

  4. import week10.OnlineArticle; 

  5. import week10.OnlineBook; 


  6. /** 

  7. * 11.8 ItemsListApp.java 测试类 

  8. */ 

  9. public class ItemListApp 



  10. public static void main(String[] args) 



  11. // a)初始化名为myItems的ItemsList对象 

  12. ItemsList myItems = new ItemsList(); 


  13. // b)通过InventoryItem的setTaxRate方法设置税率为 0.05 

  14. InventoryItem.setTaxRate(0.05); 


  15. // c)初始化以下4个货物并将其增加到myItems中 

  16. ElectronicsItem electItem = new ElectronicsItem("笔记本", 1234.56, 10); 

  17. InventoryItem item = new InventoryItem("机油", 9.8); 

  18. OnlineBook book = new OnlineBook("疯狂Java讲义", 12.3); 

  19. book.setAuthor("李刚"); 

  20. OnlineArticle article = new OnlineArticle("如何学好Java", 3.4); 

  21. article.setWordCount(700); 


  22. myItems.addItem(electItem); 

  23. myItems.addItem(item); 

  24. myItems.addItem(book); 

  25. myItems.addItem(article); 


  26. System.out.println("All inventory:\n\n" + myItems); 


  27. System.out.println("Total: " + myItems.calculateTotal(1.215)); 






运行结果:

java-7311练习(下)

week12 继承与多态:行程(一)

-------------------------2016-12-20更新

java-7311练习(下)

小变动:

  • 参考13周的截图(修改)写的 toString 方法

  • 参考13周的截图,我将类Business的静态常量AWARDMILESFACTOR初始化为2

重难点:

  • 泛型接口 Comparable<T> 的使用

  • java.util.Arrays 中排序方法sort的使用

说 明:

题目所给文本(各类机票数据示例.txt)的票据信息我用表格形式展示如下:

java-7311练习(下)

12.1 旅程类:Itinerary

  1. package week12; 


  2. /** 

  3. * 12.1 旅程类 

  4. */ 

  5. public class Itinerary 



  6. private String formAirport; 

  7. private String toAirport; 

  8. private String depDateTime; 

  9. private String arrDateTime; 

  10. private int miles; 


  11. public Itinerary 

  12. (String formAirport,String toAirport,String depDateTime,String arrDateTime,int miles) 



  13. this.formAirport = formAirport; 

  14. this.toAirport = toAirport; 

  15. this.depDateTime = depDateTime; 

  16. this.arrDateTime = arrDateTime; 

  17. this.miles = miles; 




  18. public String getDepDateTime() 



  19. return depDateTime; 




  20. public String getArrDateTime() 



  21. return arrDateTime; 




  22. public int getMiles() 



  23. return miles; 




  24. @Override 

  25. public String toString() 



  26. String output = "" 

  27. + "" + formAirport 

  28. + "-" + toAirport 

  29. + " (" + depDateTime 

  30. + " - " + arrDateTime 

  31. + ")" 

  32. + " " + miles; 

  33. return output; 





12.2 飞机票(抽象)基类:AirTicket

  1. package week12; 


  2. import java.text.DecimalFormat; 

  3. import java.text.Format; 


  4. /** 

  5. * 12.2 飞机票(抽象)基类 

  6. */ 

  7. public abstract class AirTicket implements Comparable<AirTicket> 



  8. private String flightNum; //航班号 

  9. private Itinerary itinerary; //行程 

  10. private double baseFare; //飞机票基本费用 

  11. private double fareAdjustmentFactor; //费用调整因素 


  12. public AirTicket(String flightNum,Itinerary itinerary,double baseFare,double fareAdjustmentFactor) 



  13. this.flightNum = flightNum; 

  14. this.itinerary = itinerary; 

  15. this.baseFare = baseFare; 

  16. this.fareAdjustmentFactor = fareAdjustmentFactor; 




  17. public String getFlightNum() 



  18. return flightNum; 




  19. public Itinerary getItinerary() 



  20. return itinerary; 




  21. public double getBaseFare() 



  22. return baseFare; 




  23. public double getFareAdjustmentFactor() 



  24. return fareAdjustmentFactor; 




  25. /** 

  26. * 自然比较方法:(忽略大小写)比较航班号 

  27. * @return 该对象小于、等于或大于指定对象 at,分别返回负整数、零或正整数。  

  28. */ 

  29. @Override 

  30. public int compareTo(AirTicket at) 



  31. return flightNum.compareToIgnoreCase(at.flightNum); 




  32. @Override 

  33. public String toString() 



  34. Format formater = new DecimalFormat("###,###.00"); 

  35. String output = "" 

  36. + "\nFlight: " + flightNum 

  37. + "\n" + itinerary 

  38. + " (" + totalAwardMiles() + " award miles)" 

  39. + "\nBase Fare: $" + formater.format(baseFare) 

  40. + " Fare Adjustment Factor: " + fareAdjustmentFactor 

  41. + "\nTotal Fare: $" + formater.format(totalFare()) 

  42. + "\t"; 

  43. return output; 




  44. public abstract double totalFare(); 


  45. public abstract double totalAwardMiles(); 




12.3 飞机票子类---经济舱机票:Economy

  1. package week12; 


  2. /** 

  3. * 12.3 飞机票子类---经济舱机票 

  4. */ 

  5. public class Economy extends AirTicket 



  6. private final static double AWARDMILESFACTOR = 1.5; 


  7. public Economy(String flightNum, Itinerary itinerary, double baseFare, double fareAdjustmentFactor) 



  8. super(flightNum, itinerary, baseFare, fareAdjustmentFactor); 




  9. @Override 

  10. public double totalFare() 



  11. return super.getBaseFare() * super.getFareAdjustmentFactor(); 




  12. @Override 

  13. public double totalAwardMiles() 



  14. return super.getItinerary().getMiles() * AWARDMILESFACTOR; 




  15. @Override 

  16. public String toString() 



  17. return super.toString() + " (class Economy)\n " 

  18. + "Includes Award Miles Factor: " 

  19. + AWARDMILESFACTOR; 





12.4 飞机票子类---商务舱机票:Business

  1. package week12; 


  2. /** 

  3. * 12.4 飞机票子类---商务舱机票 

  4. */ 

  5. public class Business extends AirTicket 



  6. private final static double AWARDMILESFACTOR = 2; //这里我改为2(题目为1.5) 

  7. private double foodAndBeverages; 

  8. private double entertaiment; 


  9. public Business(String flightNum, Itinerary itinerary, double baseFare, double fareAdjustmentFactor, 

  10. double foodAndBeverages, double entertaiment) 



  11. super(flightNum, itinerary, baseFare, fareAdjustmentFactor); 

  12. this.foodAndBeverages = foodAndBeverages; 

  13. this.entertaiment = entertaiment; 




  14. @Override 

  15. public double totalFare() 



  16. return super.getBaseFare() * super.getFareAdjustmentFactor() 

  17. + foodAndBeverages + entertaiment; 




  18. @Override 

  19. public double totalAwardMiles() 



  20. return super.getItinerary().getMiles() * AWARDMILESFACTOR; 




  21. @Override 

  22. public String toString() 



  23. return super.toString()+ " (class Business)\n " 

  24. + "Includes Food/Beverage: $" + foodAndBeverages 

  25. + " Entertaiment: $" + entertaiment; 






12.5 飞机票子类---不可退的机票: NonRefundable

  1. package week12; 


  2. /** 

  3. * 12.5 飞机票子类---不可退的机票 

  4. */ 

  5. public class NonRefundable extends AirTicket 



  6. private double discountFactor; 


  7. public NonRefundable(String flightNum, Itinerary itinerary, double baseFare, double fareAdjustmentFactor, 

  8. double discountFactor) 



  9. super(flightNum, itinerary, baseFare, fareAdjustmentFactor); 

  10. this.discountFactor = discountFactor; 



  11. @Override 

  12. public double totalFare() 



  13. return super.getBaseFare() * super.getFareAdjustmentFactor() 

  14. * discountFactor; 




  15. @Override 

  16. public double totalAwardMiles() 



  17. return super.getItinerary().getMiles(); 




  18. @Override 

  19. public String toString() 



  20. return super.toString()+ " (class NonRefundable)\n " 

  21. + "Includes DiscountFactor: " 

  22. + discountFactor; 





12.6 飞机票子类---商务舱机票子类---精英类机票: Elite

  1. package week12; 


  2. /** 

  3. * 12.6 飞机票子类---商务舱机票子类---精英类机票 

  4. */ 

  5. public class Elite extends Business 



  6. private double cService; 


  7. public Elite(String flightNum, Itinerary itinerary, double baseFare, double fareAdjustmentFactor, 

  8. double foodAndBeverages, double entertaiment, double cService) 



  9. super(flightNum, itinerary, baseFare, fareAdjustmentFactor, foodAndBeverages, entertaiment); 

  10. this.cService = cService; 




  11. @Override 

  12. public double totalFare() 



  13. return super.totalFare() + cService; 




  14. @Override 

  15. public double totalAwardMiles() 



  16. return super.totalAwardMiles(); 




  17. @Override 

  18. public String toString() 



  19. return super.toString()+ " \n " 

  20. + "Includes: Comm Services: $" + cService; 





12.7 测试类: AirTicketProcessor

  1. package week12; 


  2. import java.util.Arrays; 


  3. /** 

  4. * 12.7 测试类 

  5. */ 

  6. public class AirTicketProcessor 



  7. public static void main(String[] args) 



  8. AirTicket[] airTickets = new AirTicket[4]; //四张 飞机票 

  9. Itinerary trip; // 临时行程对象 


  10. // 初始化 题目给出的 四张票 

  11. trip = new Itinerary("ATL", "LGA", "2015/05/01 1500", "2015/05/01 1740", 800); 

  12. Economy economy = new Economy("DL 1867", trip, 450, 1); 

  13. trip = new Itinerary("ATL", "LGA", "2015/05/01 1400", "2015/05/01 1640", 800); 

  14. Business business = new Business("DL 1865", trip, 450, 2, 50, 50); 

  15. trip = new Itinerary("ATL", "LGA", "2015/05/01 0900", "2015/05/01 1140", 800); 

  16. Elite elite = new Elite("DL 1863", trip, 450, 2.5, 50, 50, 100); 

  17. trip = new Itinerary("ATL", "LGA", "2015/05/01 0800", "2015/05/01 1040", 800); 

  18. NonRefundable nonRefundable = new NonRefundable("DL 1861", trip, 450, 0.45, 0.9); 


  19. // 将这4个对象添加到 airTickets  

  20. airTickets[0] = (economy); 

  21. airTickets[1] = (business); 

  22. airTickets[2] = (elite); 

  23. airTickets[3] = (nonRefundable); 


  24. //输出报告 

  25. System.out.println("----------Air Ticket Report-----------"); 

  26. for (int i = 0; i < airTickets.length; i++) 

  27. System.out.println(airTickets[i]); 


  28. Arrays.sort(airTickets); // 按航班号排序并输出报告 

  29. System.out.println("\n----------Air Ticket Report (by Flight Number)-----------"); 

  30. for (int i = 0; i < airTickets.length; i++) 

  31. System.out.println(airTickets[i]); 





运行结果:

java-7311练习(下)

week13 继承与多态:行程(二)

-------------------------2016-12-20更新

小变动:

  • 读文件并分割参数我并没有使用Scanner类

  • 读文件的异常处理我没有放在 AirTicketApp 测试类中;(按照题意应在readAirTicketFile方法中throws异常,而不是直接try/catch)

重难点:

  • java.lang.Comparable<T> 接口: 强行对实现它的每个类的对象进行整体排序

  • java.util.Comparator<T> 接口: 强行对某个对象collection进行整体排序的比较函数

  • java.util.Arrays 中方法sort,copyOf的使用

说 明:

a. 有6个类我是直接使用week12的,下面是3个新写的类

b. 题目所给CSV文件(air_ticket_data.csv)我放在工程目录的resource下,如下所示:

java-7311练习(下)
  1. B,DL 1865,ATL,LGA,2015/05/01 1400,2015/05/01 1640,800,450,2.0,50.0,50.00 

  2. E,DL 1867,ATL,LGA,2015/05/01 1500,2015/05/01 1740,800,450,1.0 

  3. F,DL 1863,ATL,LGA,2015/05/01 0900,2015/05/01 1140,800,450,2.5,50.0,50.00,100.00 

  4. N,DL 1861,ATL,LGA,2015/05/01 0800,2015/05/01 1040,800,450,0.45,0.90 

  5. B,DL 1866,LGA,ATL,2015/05/01 1400,2015/05/01 1640,800,450,2.0,50.0,50.00 

  6. E,DL 1868,LGA,ATL,2015/05/01 1500,2015/05/01 1740,800,450,1.0 

  7. F,DL 1864,LGA,ATL,2015/05/01 0900,2015/05/01 1140,800,450,2.5,50.0,50.00,100.00 

  8. N,DL 1862,LGA,ATL,2015/05/01 0800,2015/05/01 1040,800,450,0.45,0.90 

-------------------------2016-12-23更新

13.8 功能类: AirTicketProcessor

  1. package week13; 


  2. import java.io.BufferedReader; 

  3. import java.io.File; 

  4. import java.io.FileReader; 

  5. import java.io.IOException; 

  6. import java.util.Arrays; 


  7. import week12.AirTicket; 

  8. import week12.Business; 

  9. import week12.Economy; 

  10. import week12.Elite; 

  11. import week12.Itinerary; 

  12. import week12.NonRefundable; 


  13. /** 

  14. * 13.8 该类完成从数据文件中读取数据并声称报告的功能 

  15. */ 

  16. public class AirTicketProcessor 



  17. private AirTicket[] Tickets; 

  18. private String[] invalidRecords; 


  19. public AirTicketProcessor() 



  20. Tickets = new AirTicket[0]; 

  21. invalidRecords = new String[0]; 




  22. /** 

  23. * 以行为单位读取文件,常用于读面向行的格式化文件 (注意:这个读取文件并分割参数的方法没有使用题目给出的方法) 

  24. */ 

  25. public void readAirTicketFile(String fileName) 



  26. // 这里我设置为 工程 目录的 resource 下 

  27. String path = "resource/" + fileName; 

  28. File file = new File(path); 


  29. BufferedReader reader = null; 

  30. try 



  31. reader = new BufferedReader(new FileReader(file)); 

  32. String tempString = null; // 每行的字符串临时变量 

  33. // 一次读入一行,直到读入null为文件结束 

  34. while ((tempString = reader.readLine()) != null) 



  35. try 



  36. String[] lineArr = tempString.split(","); 

  37. // 以 逗号 为分隔符, 并添加 票据信息 

  38. switch (lineArr[0]) 



  39. case "N": 

  40. addAirTicket(new NonRefundable(lineArr[1], 

  41. new Itinerary(lineArr[2], lineArr[3], lineArr[4], lineArr[5], 

  42. Integer.parseInt(lineArr[6])), 

  43. Integer.parseInt(lineArr[7]), Double.parseDouble(lineArr[8]), 

  44. Double.parseDouble(lineArr[9]))); 

  45. break; 

  46. case "E": 

  47. addAirTicket(new Economy(lineArr[1], 

  48. new Itinerary(lineArr[2], lineArr[3], lineArr[4], lineArr[5], 

  49. Integer.parseInt(lineArr[6])), 

  50. Double.parseDouble(lineArr[7]), Double.parseDouble(lineArr[8]))); 

  51. break; 

  52. case "B": 

  53. addAirTicket(new Business(lineArr[1], 

  54. new Itinerary(lineArr[2], lineArr[3], lineArr[4], lineArr[5], 

  55. Integer.parseInt(lineArr[6])), 

  56. Double.parseDouble(lineArr[7]), Double.parseDouble(lineArr[8]), 

  57. Double.parseDouble(lineArr[9]), Double.parseDouble(lineArr[10]))); 

  58. break; 

  59. case "F": 

  60. addAirTicket(new Elite(lineArr[1], 

  61. new Itinerary(lineArr[2], lineArr[3], lineArr[4], lineArr[5], 

  62. Integer.parseInt(lineArr[6])), 

  63. Double.parseDouble(lineArr[7]), Double.parseDouble(lineArr[8]), 

  64. Double.parseDouble(lineArr[9]), Double.parseDouble(lineArr[10]), 

  65. Double.parseDouble(lineArr[11]))); 

  66. break; 

  67. default: 

  68. addInvaildRecord(tempString); 

  69. break; 



  70. } catch (Exception e) 



  71. System.out.println("Line string split error!"); 





  72. } catch (IOException e) 



  73. System.out.println("Not find AirTicketFile!"); 

  74. // e.printStackTrace(); 

  75. } finally 



  76. if (reader != null) 



  77. try 



  78. reader.close(); 

  79. } catch (IOException e1) 












  80. /** 

  81. * 将AirTicket类数组的长度增加1,之后将传入的对象放入数组中 

  82. *  

  83. * @param airTicket 

  84. */ 

  85. public void addAirTicket(AirTicket airTicket) 



  86. Tickets = Arrays.copyOf(Tickets, Tickets.length + 1); 

  87. Tickets[Tickets.length - 1] = (airTicket); 




  88. /** 

  89. * 将invalidRecords数组的长度增加1,将传入的字符串放入数组中(每一行以代表机票种类的 字符开头(N, E, B和F是合法的机票种类), 

  90. * 如果开头字母不在此范围中,则此行为不合法记录) 

  91. *  

  92. * @param lineStr 

  93. */ 

  94. public void addInvaildRecord(String lineStr) 



  95. invalidRecords = Arrays.copyOf(invalidRecords, invalidRecords.length + 1); 

  96. invalidRecords[invalidRecords.length - 1] = (lineStr); 




  97. /** 

  98. * 返回 AirTickets报告 

  99. */ 

  100. public String generateReport() 



  101. String output = ""; 

  102. for (AirTicket airTicket : Tickets) 



  103. output += airTicket + "\n"; 



  104. return output; 




  105. /** 

  106. * 以航班号的升序 返回AirTickets报告 

  107. */ 

  108. public String generateReportByFlightNum() 



  109. String output = ""; 


  110. AirTicket[] orderT = Arrays.copyOf(Tickets, Tickets.length); 

  111. Arrays.sort(orderT); 


  112. for (AirTicket airTicket : orderT) 



  113. output += airTicket + "\n"; 



  114. return output; 




  115. /** 

  116. * 以行程的升序 返回AirTickets报告 

  117. */ 

  118. public String generateReportByItinerary() 



  119. String output = ""; 


  120. AirTicket[] orderT = Arrays.copyOf(Tickets, Tickets.length); 

  121. Arrays.sort(orderT, new ItineraryCompare()); 


  122. for (AirTicket airTicket : orderT) 



  123. output += airTicket + "\n"; 



  124. return output; 





13.9 自定义排序类: ItineraryCompare

  1. package week13; 


  2. import java.util.Comparator; 


  3. import week12.AirTicket; 


  4. /** 

  5. * 13.9 按照 Itinerary的tostring值由低到高排序 

  6. */ 

  7. public class ItineraryCompare implements Comparator<AirTicket> 



  8. /** 

  9. * @return 根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。 

  10. */ 

  11. @Override 

  12. public int compare(AirTicket t1, AirTicket t2) 



  13. return t1.getItinerary().toString().compareTo(t2.getItinerary().toString()); 





13.10 测试类: AirTicketApp

  1. package week13; 


  2. import java.util.Scanner; 


  3. /** 

  4. * 13.10 测试类 

  5. */ 

  6. public class AirTicketApp 



  7. public static void main(String[] args) 



  8. // 1. 创建AirTicketProcessor对象 

  9. AirTicketProcessor atp = new AirTicketProcessor();  


  10. // 2. 判断命令行是否有参数(args.lengh的长度是否为0), 

  11. // 如果没有,则输出“命令行中没有提供文件名,程序终止” 

  12. Scanner scan = new Scanner(System.in); 


  13. System.out.print("请输入文件名:"); // air_ticket_data.csv 

  14. String fileName = scan.nextLine(); 

  15. scan.close(); 

  16. if (fileName.length() == 0) 



  17. System.out.println("命令行中没有提供文件名,程序终止"); 

  18. System.exit(0); 




  19. // 3.调用 AirTicketProcessor的方法读入数据文件,输出三个报告。 

  20. atp.readAirTicketFile(fileName); 

  21. System.out.println("----------Air Ticket Report-----------"); 

  22. System.out.println(atp.generateReport()); 

  23. System.out.println("----------Air Ticket Report (by Flight Number)-----------"); 

  24. System.out.println(atp.generateReportByFlightNum()); 

  25. System.out.println("----------Air Ticket Report (by Itinerary)-----------"); 

  26. System.out.println(atp.generateReportByItinerary()); 


  27. // 期间有如果没有找到文件,则抛出异常“文件没有找到,程序终止” 

  28. // (我已经在AirTicketProcessor中捕获异常,故这里省略了。) 

  29. // (如果按照题目意思,需要将readAirTicketFile方法中 抛出异常,在这里捕获即可。) 





运行结果:

java-7311练习(下)

第二次小组作业:???

java-7311练习(下)的更多相关文章

  1. java从基础知识(十)java多线程(下)

    首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...

  2. Java和C&num;下的参数验证

    参数的输入和验证问题是开发时经常遇到的,一般的验证方法如下: public bool Register(string name, int age) { if (string.IsNullOrEmpty ...

  3. spring java 获取webapp下文件路径

    spring java 获取webapp下文件路径 @RequestMapping("/act/worldcup_schedule_time/imgdownload") @Resp ...

  4. java 获取classpath下文件多种方式

    java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...

  5. Java基础(下)&lpar;JVM、API&rpar;

    Java基础(下) 第三部分:Java源程序的编辑 我们知道,计算机是不能直接理解源代码中的高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序. 翻译 ...

  6. java 提取目录下所有子目录的文件到指定位置

    package folder; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundExcept ...

  7. java在cmd下编译引用第三方jar包

    java在cmd下编译引用第三方jar包 转 https://blog.csdn.net/qq_21439971/article/details/53924594 获取第三方jar包 第三包我们可以引 ...

  8. 解决:java 读取 resources 下面的 json 文件

    前言:java 读取 工程下的配置文件,文件类型为 json(*.json),记录一下始终读取不到 json 文件的坑.maven项目 直接上工具类代码 package com.yule.compon ...

  9. JVM&lpar;四&rpar;&colon;深入分析Java字节码-下

    JVM(四):深入分析Java字节码-下 在上文中,我们讲解了 Class 文件中的文件标识,常量池等内容.在本文中,我们就详细说一下剩下的指令集内容,阐述其分别代表了什么含义,以及 JVM 团队这样 ...

  10. 《ElasticSearch6&period;x实战教程》之复杂搜索、Java客户端(下)

    第八章-复杂搜索 黑夜给了我黑色的眼睛,我却用它寻找光明. 经过了解简单的API和简单搜索,已经基本上能应付大部分的使用场景.可是非关系型数据库数据的文档数据往往又多又杂,各种各样冗余的字段,组成了一 ...

随机推荐

  1. 笔记:Binder通信机制

    TODO: 待修正 Binder简介 Binder是android系统中实现的一种高效的IPC机制,平常接触到的各种XxxManager,以及绑定Service时都在使用它进行跨进程操作. 它的实现基 ...

  2. linux系统中如何查看日志&lpar;转&rpar;

    cat tail -f 日 志 文 件 说    明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安 ...

  3. c&plus;&plus;防止客户端多开巧妙代码

    在读OBS源码时看到一个比较有意思的关于防止用户多开程序的写法,简单有效,记录下 //make sure only one instance of the application can be ope ...

  4. scrapy基础教程

    1. 安装Scrapy包 pip install scrapy, 安装教程 Mac下可能会出现:OSError: [Errno 13] Permission denied: '/Library/Pyt ...

  5. Linux启动过程中几个重要配置文件的执行过程

    Linux 登录后,配置执行顺序为(Debian Serials Capable):/etc/environment -> /etc/profile -> (~/.bash_profile ...

  6. MyBatis SQL xml处理小于号与大于号

    MyBatis SQL xml处理小于号与大于号 当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台 ...

  7. DevExpress控件水印文字提示

    ButtonEdit.Properties.NullValuePrompt = "提示"; ButtonEdit.Properties.NullValuePromptShowFor ...

  8. Django Web开发【4】 用户注册与管理

    几乎所有的网站都提供了用户注册与管理功能,这一节,我们将讲解如何利用Django自身提供的用户认证系统实现用户注册与管理功能. 会话认证 在上一节中,我们学习了User数据模型,并用它来保存用户信息, ...

  9. 《JavaScript&plus;DOM编程艺术》的摘要(四)appendChild与insertBefore的区别

    基本知识点: // 1.js里面为什么要添加window.onload=function (){} // 保证html文档都加载完了,才开始运行js代码,以防html文档没有加载完,找不到相应的元素 ...

  10. linux 定时任务详解 按秒设定

    实现linux定时任务有:cron.anacron.at等,这里主要介绍cron服务. 名词解释: cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表. 软件包安装: 要使 ...