list对象去重
程序员文章站
2022-03-12 16:50:16
转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10334267.html 咋们来看看。首先定义一个对象,随便吧 然后有好多的Data对象放在list数组中,而我们要根据Data对象里面的s来判断list中是否有相同的对象,如果用for循环一个个来比较,那 ......
转载请标明出处,维权必究:https://www.cnblogs.com/tangzh/p/10334267.html
咋们来看看。首先定义一个对象,随便吧
public class data{ public string s; }
然后有好多的data对象放在list数组中,而我们要根据data对象里面的s来判断list中是否有相同的对象,如果用for循环一个个来比较,那么当里边的对象越多,那么比较的次数也会越来越多,这不是好做法,那应该怎么比较呢?
这就要利用hashset的性质,不可重复。
hashset如何实现去重:
是通过调用元素内部的hashcode和equals方法实现去重,首先调用hashcode方法,比较两个元素的哈希值,如果哈希值不同,直接
认为是两个对象,停止比较。如果哈希值相同,再去调用equals方法,返回true,认为是一个对象。返回false,认为是两个对象。
hashset查找的高效性:
hash算法对每一个对象都计算出一个hash码,根据hash码把对象分配到某个存储区域中,比如一个集合包含了很多人,根据国籍,中国人是一个存储区域,美国人是一个存储区域,英国人是一个存储区域,......。这样如果要查找该集合是否包含了某个中国人,就到中国人的存储区域去比较就行了,这样大大提高了效率。
java中实现了hash的集合是hashset。hashset查找某个对象时,首先用hashcode()方法计算出这个对象的hash码,然后再根据hash码到相应的存储区域用equals()方法查找。
由此可见利用hashset去重是可行的。
1、重写比较对象data的的hashcode与equal方法。
@override public int hashcode() { if (null == s) return super.hashcode(); else {
//相同string的hashcode是一样的,所以若当之前已经有了一个对象,并且s
//与将要加入的对象的s一样,那么由于两个对象有相同hashcode,
//那么他们就会去执行equal方法进行比较,若是一样,后面的对象加入失败
return s.hashcode(); } } @override public boolean equals(object obj) { if (null == obj) return false; if (obj == this) return true; if (!(obj instanceof data)) return false; data data = (data) obj; if (data.s.equals(s)) return true; return false; }
2、比较:
list list = new arraylist<data>(); for(int i = 0;i<10;i++) { data data = new date(); data.s = "" + i; list.add(data); }
hashset h = new hashset(list); list.clear(); list.addall(h);
hashset h = new hashset(list);
这一步会将重复的元素去掉,当然,不是随机去掉,而是list中排在后面的与前面相同的去掉。因为是一个个加入hashset里面的,当然最终得到的结果是无序的,如果需要按照原来的顺序还需要进行排序处理