要求是:模拟超市收银系统的一些一般功能,J2SE实现,无界面在做循环扫描商品,并显示购物清单功能的时候遇到了点问题。我的思路是:
1.建立一个类,类中包含商品Id,和number
然后从控制台循环接收扫描的ID和number,每次接收都保存成一个类对象
客户端建立a集合(ArrayList),每次循环都把这个对象add进去
当扫描结束之后,建立b集合(HashMap),键值1是1(代表扫描商品功能)
键值2是a集合,然后把b集合传入服务端
服务端接收到1就调用扫描商品的功能,然后在扫描商品功能里我就犯2了
不知道该怎么遍历集合,服务端这里貌似有三个集合,一个是b集合,一个是a集合,
一个是系统商品库集合(ArrayList保存的).服务端要做的事情就是,服务端传来的
Id和商品库中ID相同时候,把库存数量修改成购买数量,并且如果Id重复,就把购买数量相加,
然后把最终结果返回客户端,客户端再遍历输出到控制台
我总感觉我思路不对,太烦琐了,集合遍历这块还不容易实现,大家有木有其他好的实现思路,求分享。。
额,单个集合我知道怎么遍历,也许是上面我实现的思路比较绕,叙述又比较罗索,其实需求简单的说就是:利用IO、Socket,集合,模拟实现超市的商品扫描功能。收银员从控制台循环输入顾客购买的商品ID和购买数量,直到输入N为结束扫描,然后把顾客所有购买的商品和服务端的商品库存进行比较,处理完了,把购物清单返回给客户端。这个有什么比较好的思路呢,我觉得我的思路不行。
如果要,循环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
}其它说,楼主说这个集合那个集合的,偶就不知道什么意思了。
//假设用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()); //返回给客户端的清单合计
//...其他合计
}
服务端改动如下,可以实现购物清单功能,但是客户端只能显示一条记录
也就是说服务端写一次之后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();
}
}
}
}
而且相同ID的商品,购买数量不能累加。