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来显示的。求解决方法~~~

参考技术A 这个问题很简单
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。这样应该可以了吧

本回答被提问者采纳
参考技术B 要看ArrayList里面存的是什么什么类型的数据。
如果是基本数据类型,那么遍历的时候一个个比对一次就去掉了。
如果是复发类型,就去比对里面的成员。
参考技术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)
循环!

参考技术D 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);
追问

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 如何去除相同元素,求指点。的主要内容,如果未能解决你的问题,请参考以下文章

java第十四天

java 16-1 ArrayList的练习1

去除ArrayList集合中重复字符串元素方式_思路:创建新集合方式

java ArrayList去重

用Java中的ArrayList实现:去除集合中字符串的重复值(字符串的内容相同)

java-ArrayList中去重复字符串或重复对象LinkedList集合泛型增强for静态导入可变参数asList()方法集合嵌套