java中 ArrayList 如何去除相同元素,求指点。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中 ArrayList 如何去除相同元素,求指点。相关的知识,希望对你有一定的参考价值。
需求:模拟超市的收银系统的扫描功能,无界面,商品库存用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来显示的。求解决方法~~~
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
真不行,要不我QQ把工程发给你吧,其他不用看,都是对的,就看扫描商品那块。 QQ767632759
追答/*********收银员操作**************/
//扫描商品
public void scangoods() throws IOException
int newnum=0;
ArrayList myId=(ArrayList)clientComm.get("2");
myList.clear();
for(int j = 0 ; j <myId.size();j++)
int buyId = myId.get(j);
for(int i = 0; i <goodsData.size();i++)
ShopGoods sg = goodsData.get(i);
if(sg.getGid()==buyId)
addMyList(sg);
break;
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(myList);
public void addMyList(ShopGoods sg)
for(int i=0;i<myList.size();i++)
if(myList.get(i).getGid()==sg.getGid())
int num=myList.get(i).getGnum()+1;
myList.get(i).setGnum(num);
return;
sg.setGnum(1);
myList.add(sg);
换成这两个方法吧,我原来理解错了,一位输出的是goodsData。这样应该可以了吧
如果是基本数据类型,那么遍历的时候一个个比对一次就去掉了。
如果是复发类型,就去比对里面的成员。 参考技术C 你这样肯定每次都是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);
刚开始myList是空的,就是用来保存处理过的购物清单的,在那里遍历肯定不行,里面是空的
追答你判断一下不等于空在循环!
if(myList!=null)
循环!
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,怎么不存对象,你的想办法得到原谅的数量
第5个回答 2012-07-30 给 ShopGoods 加一个private Date date 属性!来区分相同产品不会显示相同记录!追问不明白,能否给个例子?
追答ShopGoods这对象里面有 date属性吗? 用日期作为一个在显示上面的标识符! 因为每次扫描的时间不同,所以不会列入同一条记录!
2019-05-25 Java学习日记之List集合
去除ArrayList中重复字符串元素方式:
需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
去除ArrayList中重复自定义对象元素:
需求:ArrayList去除自定义对象元素的重复值(对象的成员变量值相同)
注意事项:重写equals()方法
LinkedList的特有功能:
栈和队列数据结构:
栈:先进后出
队列:先进后出
用LinkedList模拟栈数据结构的集合并测试:
需求:用LinkedList模拟栈数据结构的集合,并测试
创建一个类将LinkedList中的方法封装
泛型概述和基本使用:
A:泛型的好处
提高安全性(将运行期的错误转换到编译期)
省去强转的麻烦
B:泛型的基本使用
<>中放的必须是引用数据类型
C:泛型使用的注意事项
前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)
ArrayList存储字符串和自定义对象并遍历泛型版:
增强for的概述和使用:
A:概述
简化数组和Collection集合的遍历
B:格式
for(元素数据类型 变量 :数组或者Collection集合) {
使用变量即可,该变量就是元素
}
C:好处
简化遍历
ArrayList存储字符串和自定义对象并遍历增强for版:
三种迭代的能否删除:
普通for循环,可以删除,但是索引要--
迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
增强for循环不能删除
可变参数的概述和使用:
A:概述
定义方法的时候不知道该定义多少个参数
B:格式
修饰符 返回值类型 方法名(数据类型... 变量名){}
C:注意事项
这里的变量其实是一个数组
如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
Arrays工具类的asList()方法的使用:
集合嵌套之ArrayList嵌套ArrayList:
以上是关于java中 ArrayList 如何去除相同元素,求指点。的主要内容,如果未能解决你的问题,请参考以下文章
去除ArrayList集合中重复字符串元素方式_思路:创建新集合方式
用Java中的ArrayList实现:去除集合中字符串的重复值(字符串的内容相同)
java-ArrayList中去重复字符串或重复对象LinkedList集合泛型增强for静态导入可变参数asList()方法集合嵌套