要求是:模拟超市收银系统的一些一般功能,J2SE实现,无界面在做循环扫描商品,并显示购物清单功能的时候遇到了点问题。我的思路是:
1.建立一个类,类中包含商品Id,和number
然后从控制台循环接收扫描的ID和number,每次接收都保存成一个类对象
客户端建立a集合(ArrayList),每次循环都把这个对象add进去
当扫描结束之后,建立b集合(HashMap),键值1是1(代表扫描商品功能)
键值2是a集合,然后把b集合传入服务端
服务端接收到1就调用扫描商品的功能,然后在扫描商品功能里我就犯2了
不知道该怎么遍历集合,服务端这里貌似有三个集合,一个是b集合,一个是a集合,
一个是系统商品库集合(ArrayList保存的).服务端要做的事情就是,服务端传来的
Id和商品库中ID相同时候,把库存数量修改成购买数量,并且如果Id重复,就把购买数量相加,
然后把最终结果返回客户端,客户端再遍历输出到控制台
我总感觉我思路不对,太烦琐了,集合遍历这块还不容易实现,大家有木有其他好的实现思路,求分享。。

解决方案 »

  1.   

    你描述需求比较绕啊看了一半我就放弃了遍历单个集合可以用 迭代器 iterator去集合(Set)中找元素,直接就可以get了,并不需要遍历。
      

  2.   


    额,单个集合我知道怎么遍历,也许是上面我实现的思路比较绕,叙述又比较罗索,其实需求简单的说就是:利用IO、Socket,集合,模拟实现超市的商品扫描功能。收银员从控制台循环输入顾客购买的商品ID和购买数量,直到输入N为结束扫描,然后把顾客所有购买的商品和服务端的商品库存进行比较,处理完了,把购物清单返回给客户端。这个有什么比较好的思路呢,我觉得我的思路不行。
      

  3.   

    b是个map
    如果要,循环b 中的 a ,那么:List a = new ArrayList();
    Map b = new HashMap();
    b.put(1, 1);
    b.put(2,b);
    List list = (List)b.get(2);//取得集合a
    for(Object o : list){//循环集合a

    }其它说,楼主说这个集合那个集合的,偶就不知道什么意思了。
      

  4.   

    就是循环嵌套服务器端处理List<xxx> serverList = ...; //假设系统商品库集合,xxx是商品类//接收处理
    //假设用Object序列化传输
    new ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
    Map<Integer, Object> map = (Map<Integer, Object>)ois.readObject();
    List<xxx> clientList = (List<xxx>)map.get(2);
    Map<Integer, xxx> result = new HashMap<Integer, xxx>(); //返回给客户端
    for (xxx a : clientList) {
        for (xxx b : serverList) {
            if (a.getId() == b.getId()) {//客户端和系统商品库集合id相同
                b.setAmount(b.getAmout() + a.getAmount()); //系统商品集合数量修改
                  //....其他修改
            }
        }
        if (!result.containsKey(a.getId)) {
            result.put(a.getId(), new xxx());
        }
        xxx b = result.get(a.getId());
        b.setAmout(b.getAmout() + a.getAmout()); //返回给客户端的清单合计
        //...其他合计
    }
      

  5.   


    服务端改动如下,可以实现购物清单功能,但是客户端只能显示一条记录
    也就是说服务端写一次之后socket就关闭了,求看看~
    public void scangoods() throws IOException
    {
    int newnum = 0;
    buyList =(ArrayList)clientComm.get("3");//取出客户端传来的顾客购买商品ID、数量集合
    for(BuySend bs:buyList)
    {
    //对比商品库
    for(int i = 0; i <goodsData.size();i++)//goodsData是系统商品库集合
    {
    ShopGoods sg = goodsData.get(i);
    if(sg.getGid()==bs.getBuyId())
    {
    ShopGoods newList = new ShopGoods
    (sg.getGid(),sg.getGname(),sg.getGmean(),sg.getGprice(),newnum+=bs.getBuyNum());
    myList.add(newList);
    ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
    oos.writeObject(myList);
    oos.flush();
    oos.close();
    }
    }

    }
    }
      

  6.   

    客户端没啥问题,能读出来,但问题是只能读一行,服务端写到客户端的,是第一次从控制台输入的商品ID、num,第二次输入的就写不到客户端了,报错socket is closed
    而且相同ID的商品,购买数量不能累加。