java中 ArrayList 如何去除相同元素,求指点。
需求:模拟超市的收银系统的扫描功能,无界面,商品库存用ArrayList存放在服务端。客户端从控制台循环接收用户输入的各种商品Id(可重复),直到输入n为止,然后把商品I...
需求:模拟超市的收银系统的扫描功能,无界面,商品库存用ArrayList存放在服务端。
客户端从控制台循环接收用户输入的各种商品Id(可重复),直到输入n为止,然后把商品Id传入服务端和商品库存比较,如果库存有此商品,数量set为1,如果同一Id遇到扫描2次的情况,数量变2,以此类推。
列出我服务端代码
for(int j = 0 ; j <myId.size();j++){ //myId 是客户端传来的所有扫描Id集合
int buyId = myId.get(j);
for(int i = 0; i <goodsData.size();i++) //goodData是商品库存集合
{
ShopGoods sg = goodsData.get(i);
if(sg.getGid()==buyId)
{
int newnum =0;
sg.setGnum(newnum+=1);
sg=new ShopGoods(sg.getGid(),sg.getGname(),sg.getGmean(),sg.getGprice(),sg.getGnum());
myList.add(sg);
}
}
}
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(myList);
现在问题是,我输入的每个Id所代表的商品都可以在控制台显示出来,并且数量是1
但是遇到相同商品扫描2次,数量就不能动态的改变成2,而是以两条记录,并且数量都是1来显示的。求解决方法~~~ 展开
客户端从控制台循环接收用户输入的各种商品Id(可重复),直到输入n为止,然后把商品Id传入服务端和商品库存比较,如果库存有此商品,数量set为1,如果同一Id遇到扫描2次的情况,数量变2,以此类推。
列出我服务端代码
for(int j = 0 ; j <myId.size();j++){ //myId 是客户端传来的所有扫描Id集合
int buyId = myId.get(j);
for(int i = 0; i <goodsData.size();i++) //goodData是商品库存集合
{
ShopGoods sg = goodsData.get(i);
if(sg.getGid()==buyId)
{
int newnum =0;
sg.setGnum(newnum+=1);
sg=new ShopGoods(sg.getGid(),sg.getGname(),sg.getGmean(),sg.getGprice(),sg.getGnum());
myList.add(sg);
}
}
}
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(myList);
现在问题是,我输入的每个Id所代表的商品都可以在控制台显示出来,并且数量是1
但是遇到相同商品扫描2次,数量就不能动态的改变成2,而是以两条记录,并且数量都是1来显示的。求解决方法~~~ 展开
5个回答
展开全部
这个问题很简单
if(sg.getGid()==buyId) {//如果ID存在
int newnum =sg.getGnum()+1;//新的数目等于原来的加1
goodsData.get(i).setGnum(newnum);//把这个新的数量存进去,而不必新增一条记录
}
这样既可,行与不行以试便知。
if(sg.getGid()==buyId) {//如果ID存在
int newnum =sg.getGnum()+1;//新的数目等于原来的加1
goodsData.get(i).setGnum(newnum);//把这个新的数量存进去,而不必新增一条记录
}
这样既可,行与不行以试便知。
更多追问追答
追问
我重新说下
比如第一次扫描a商品,结果应该是:
a 1
第二次扫描到a,第一次扫描到b商品,结果是:
a 2
b 1
这是我想要的效果,
你说的我试了,第一次对了,第二次结果是:
a 2
a 2
b 3
次数不对,商品也无法合并。
追答
不可能吧,难道是没加break
if(sg.getGid()==buyId) {//如果ID存在
int newnum =sg.getGnum()+1;//新的数目等于原来的加1
goodsData.get(i).setGnum(newnum);//把这个新的数量存进去,而不必新增一条记录
break;
}
没给出所有代码,也没法测试
我做了一个测试,逻辑是可以的啊
public static void main(String[] args){
List oldList=new ArrayList();
oldList.add(new Point(1,0));//表示编号为1,数量为0
oldList.add(new Point(2,0));//表示编号为2,数量为0
List idIn=new ArrayList();
idIn.add(1);
idIn.add(2);
idIn.add(1);
for(int j=0;j<idIn.size();j++){
int id=idIn.get(j);
for(int i=0;i<oldList.size();i++){
Point apoint=oldList.get(i);
if(id == apoint.x){
oldList.get(i).y=apoint.y+1;
break;
}
}
}
for(int i=0;i<oldList.size();i++){
Point point=oldList.get(i);
System.out.println("id:"+point.x+" 数量:"+point.y);
}
}
运行结果:
id:1 数量:2
id:2 数量:1
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
要看ArrayList里面存的是什么什么类型的数据。
如果是基本数据类型,那么遍历的时候一个个比对一次就去掉了。
如果是复发类型,就去比对里面的成员。
如果是基本数据类型,那么遍历的时候一个个比对一次就去掉了。
如果是复发类型,就去比对里面的成员。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这样肯定每次都是1,因为你每次都把newnum重新赋值为0了!
解决方案呢!你可以将你每次扫描过的东西的数量存起来,当下一次在扫描到该商品时,加上即可!
解决方案呢!你可以将你每次扫描过的东西的数量存起来,当下一次在扫描到该商品时,加上即可!
更多追问追答
追问
可否写个具体实现?
追答
if(sg.getGid()==buyId)
{
int newnum =0;//去掉
在这里循环你的myList根据id找出数量
sg.setGnum(newnum+=1);
sg=new ShopGoods(sg.getGid(),sg.getGname(),sg.getGmean(),sg.getGprice(),sg.getGnum());
myList.add(sg);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
if里面改这样写:
if(sg.getGid()==buyId)
{
int newnum =myId.get(j).getGnum();//得到原有数量
sg.setGnum(newnum+1);
sg=new ShopGoods(sg.getGid(),sg.getGname(),sg.getGmean(),sg.getGprice(),sg.getGnum());
myList.add(sg);
}
if(sg.getGid()==buyId)
{
int newnum =myId.get(j).getGnum();//得到原有数量
sg.setGnum(newnum+1);
sg=new ShopGoods(sg.getGid(),sg.getGname(),sg.getGmean(),sg.getGprice(),sg.getGnum());
myList.add(sg);
}
追问
myId里面都是Id,没有num。如果是goodsData得到原有数量,就更不对了
追答
居然是存的id,怎么不存对象,你的想办法得到原谅的数量
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
给 ShopGoods 加一个private Date date 属性!来区分相同产品不会显示相同记录!
追问
不明白,能否给个例子?
追答
ShopGoods这对象里面有 date属性吗? 用日期作为一个在显示上面的标识符! 因为每次扫描的时间不同,所以不会列入同一条记录!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询