黑马程序员技术交流社区

标题: 困扰了我两三天的问题,寻找大神 [打印本页]

作者: 小黑子    时间: 2014-9-7 15:43
标题: 困扰了我两三天的问题,寻找大神
本帖最后由 小黑子 于 2014-9-8 10:57 编辑

这是第二次发这段代码。上一次发帖把旧的问题解决了。可是新的问题一直没解决。而那个帖子也再也没人光顾,可是这个新的问题已经困扰我两三天了,不得以只能另开新帖,寻找大神!代码如下,问题如图。跪谢~~!!

  1. /*
  2. 需求:使用数组保存CD信息,实现增、删、查、打印的功能
  3. 思想:1.建立一个CD类,存储CD基本信息
  4.         2、建立一个CDManager类,定义对CD的操作
  5.         3、建立一个MainInput类,定义一些信息输入的操作
  6. */

  7. import java.util.Vector;
  8. import java.io.*;
  9. //CD类
  10. class CD
  11. {
  12.         String cdid;
  13.         String cdname;
  14.         float price;
  15.         String press;

  16.         CD(){}
  17.         CD(String cdid,String cdname,float price,String press)
  18.         {
  19.                 this.cdid=cdid;
  20.                 this.cdname=cdname;
  21.                 this.price=price;
  22.                 this.press=press;
  23.         }

  24.         void setID(String cdid)
  25.         {
  26.                 this.cdid=cdid;
  27.         }
  28.         void setName(String cdname)
  29.         {
  30.                 this.cdname=cdname;
  31.         }
  32.         void setPrice(float price)
  33.         {
  34.                 this.price=price;
  35.         }
  36.         void setPress(String press)
  37.         {
  38.                 this.press=press;
  39.         }        
  40. }
  41. //定义对CD类的一些操作
  42. class CDManager
  43. {
  44.         Vector vec;
  45.         int count=0;

  46.         CDManager()
  47.         {
  48.                 vec = new Vector(50,1);
  49.         }
  50.         
  51.         public void addCD(CD c)                //添加CD
  52.         {
  53.                 //vec.addElement(c);
  54.                 vec.insertElementAt(c,count++);
  55.         }
  56.         public int findCDById(String id)//查找CD,按ID
  57.         {
  58.                 CD getcd = new CD();
  59.                 for(int i=0;i<vec.size();i++)
  60.                 {
  61.                         getcd = (CD) vec.elementAt(i);
  62.                         if(id == getcd.cdid)
  63.                         {
  64.                                 return i;
  65.                         }
  66.                 }
  67.                 return -1;
  68.         }
  69.         public int removeCDById(String id)//删除CD,按ID
  70.         {
  71.                 for(int i=0;i<vec.size();i++)
  72.                 {
  73.                         if(id == ((CD)vec.elementAt(i)).cdid)
  74.                         {        
  75.                                 vec.removeElementAt(i);
  76.                                 return 1;
  77.                         }
  78.                 }
  79.                 return -1;
  80.         }
  81.         public void printCD()//打印CD
  82.         {
  83.                 System.out.println("printCD over1");
  84.                 CD getcd = new CD();
  85.                 for(int i=0;i<vec.size();i++)
  86.                 {                        
  87.                         getcd = (CD) vec.elementAt(i);
  88.                         System.out.println("ID:"+getcd.cdid+"\tName: "+getcd.cdname+"\tPrice: "+getcd.price+"\tPress: "+getcd.press);
  89.                 }
  90.                 System.out.println("printCD over2");
  91.         }
  92. }

  93. //输入信息的一个类
  94. class MainInput
  95. {
  96.         public String inputstr()
  97.         {
  98.                 String pm = "";
  99.                 try
  100.                 {
  101.                         InputStreamReader reader = new InputStreamReader(System.in);
  102.                         BufferedReader input = new BufferedReader(reader);
  103.                         pm = input.readLine();
  104.                 }
  105.                 catch (IOException e)
  106.                 {
  107.                         System.out.println("IO Exception occur...");
  108.                 }
  109.                 return pm;
  110.         }
  111.         public void input(CDManager cm)
  112.         {
  113.                 int gate=0;//接收输入的选项
  114.                 String str;//接收输入的字符串
  115.                 float flo;//接收输入的价格
  116.                 CD getcd = new CD();
  117.                 int count = 0;
  118.                 System.out.println("---------------Welcome to Media Manage System---------------");
  119. lab_wl:        while(true)
  120.                 {
  121.                         count++;
  122.                         System.out.println("1. add CD");
  123.                         System.out.println("2. find CD by ID");
  124.                         System.out.println("3. remove CD by ID");
  125.                         System.out.println("0. exit system");
  126.                         System.out.println("Enter your choose: ");
  127.                         try
  128.                         {
  129.                                 gate = Integer.parseInt(inputstr());
  130.                         }
  131.                         catch (NumberFormatException e)
  132.                         {
  133.                                 System.out.println("invalid data format...");
  134.                         }
  135.                         
  136.                         switch(gate)
  137.                         {
  138.                                 case 1:
  139.                                         System.out.println("Enter CD ID: ");
  140.                                         str = inputstr();
  141.                                         getcd.cdid = str;
  142.                                         System.out.println("Enter cd name: ");
  143.                                         str = inputstr();
  144.                                         getcd.cdname = str;                                       
  145.                                         while(true)
  146.                                         {//此循环用于保证输入float错误可以重新输入
  147.                                                 System.out.println("Enter price: ");
  148.                                                 try
  149.                                                 {
  150.                                                         flo = Float.parseFloat(inputstr());
  151.                                                         getcd.price = flo;
  152.                                                         break;
  153.                                                 }
  154.                                                 catch (NumberFormatException e)
  155.                                                 {
  156.                                                         System.out.println("invalid data format...");
  157.                                                 }
  158.                                                 
  159.                                         }
  160.                                         System.out.println("Enter press: ");
  161.                                         str = inputstr();
  162.                                         getcd.press = str;

  163.                                         cm.addCD(getcd);
  164.                                         //以下为测试代码段,用于测试数据是否正确存入cm.vec
  165.                                                 System.out.println("\n======1=======\n");
  166.                                                 CD getcds = new CD();
  167.                                                 System.out.println(cm.vec.size());
  168.                                                 for(int i=0;i<cm.vec.size();i++)
  169.                                                 {                        
  170.                                                         getcds = (CD) cm.vec.elementAt(i);
  171.                                                         System.out.println("ID:"+getcds.cdid+"\tName: "+getcds.cdname+"\tPrice: "+getcds.price+"\tPress: "+getcds.press);
  172.                                                 }
  173.                                                 System.out.println("\n=========2=========\n");
  174.                                         //测试结束
  175.                                         break;
  176.                                 case 0:
  177.                                         break lab_wl;
  178.                                 default: break;
  179.                         }//end of switch               
  180.                 }//end of while               
  181.         }
  182. }
  183. class MyMediaDemo
  184. {
  185.         public static void main(String[] args)
  186.         {
  187.                 CDManager cm = new CDManager();
  188.                 MainInput mi = new MainInput();
  189.                 mi.input(cm);
  190.                 //cm.printCD();
  191.         }
  192. }
复制代码




MMD1.png (8.97 KB, 下载次数: 15)

MMD1.png

MMD2.png (64.74 KB, 下载次数: 8)

MMD2.png

作者: 中华教书人    时间: 2014-9-7 18:41
本帖最后由 中华教书人 于 2014-9-7 18:43 编辑

提供几点疑惑
1、为什么选择用vetor类呢,这个已经过时了,用List集合多好
2、定义的count变量每循环一次,会加一,这就解释了为什么你会打印输出两遍
3、你循环输出的测试代码位于while循环内的case分支内,将这段代码放到case分支以外,while循环以内,再测试一下结果
4、个人建议,将添加删除 等操作提炼出来作为单独方法,在case满足case条件是调用即可,都放到case条件中,个人感觉不是很妥当
作者: wawsc5354524    时间: 2014-9-7 21:28
新手来看看,暂时还帮不到楼主什么,不过提一些建议.楼主可以在优化一下代码,是否有点长.2,楼主的查询条件太多,没查询一条信息,就得全部输入那条信息的全部内容,可是加入我希望通过名字查询到价格呢?求后续优化..
作者: lhtwm1    时间: 2014-9-7 22:16
这么长的代码。。。。。初学者都怕了
作者: fantacyleo    时间: 2014-9-7 22:36
你124行的while(true)放置的位置不对。因为你的getcd变量在while(true)之外,导致无论while(true)执行多少次,操作的都是同一个getcd变量,后一组cd信息覆盖了前一组,结果就是打印时只出现一组信息
作者: 不服™け你咬我    时间: 2014-9-7 23:48
基础,好怕怕哦
作者: 小黑子    时间: 2014-9-8 10:56
fantacyleo 发表于 2014-9-7 22:36
你124行的while(true)放置的位置不对。因为你的getcd变量在while(true)之外,导致无论while(true)执行多少 ...

太感谢了,大神就是大神,每次都是你帮了解决问题:D
这次我知道了,原来向Vector类中添加数据,不是添加真正的数据,其实是把数据的地址放进去了!
谢谢!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2