java怎么判断两个Set 里的对象的值是否相同【两个set中的值是否相等】、java treeset和hashset如何判断元素是否相同【即对象是否完全相同;利用一个set去除重复元素】
来源:互联网 发布:json格式转换txt 编辑:程序博客网 时间:2024/05/16 13:00
文章来源:http://blog.csdn.net/lxqluo/article/details/31394393
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否public static boolean isSetEqual(Set set1, Set set2) { if (set1 == null && set2 == null) { return true; // Both are null } if (set1 == null || set2 == null || set1.size() != set2.size() || set1.size() == 0 || set2.size() == 0) { return false; } Iterator ite1 = set1.iterator(); Iterator ite2 = set2.iterator(); boolean isFullEqual = true; <span style="color:#ff9966;"> while (ite2.hasNext()) { if (!set1.contains(ite2.next())) { isFullEqual = false; } }</span> return isFullEqual; }
在使用treeset和hashset重复添加元素时,发现二者在比较自定义对象元素上不一样,如下例假设record对象包含两个信息,一个为int age,一个为String nameSet<record> t0= new TreeSet<record>();t0.add(new record(1,"lAn"));t0.add(new record(1,"lAn"));t0.add(new record(1,"lAn"));System.out.println(t0);treeset的输出为[1 lAn]将相同元素添加到hashset中Set<record> t1= new HashSet<record>();t1.add(new record(1,"lAn"));t1.add(new record(1,"lAn"));t1.add(new record(1,"lAn"));System.out.println(t0);输出为[1 lAn,1 lAn,1 lAn]为什么会有这种情况呢? hashset和treeset是怎么比较元素相等的?答:
我想看下你得record类,问题可能出在你得record类里面,你是不是重写了hashcode方法?
刚才看了一下,问题出在你得record类应该,你没有生成一个hashcode()方法,所以你得hashcode方法继承自object类
object类的hashcode算法hashcode算出来的结果就是该对象在内存中的地址的十进制表示,你每次都是new出来的record,所以他们的内存地址一定是不一样,那么这就说明他们的hashcode不一样,而hashset对于相同对象的比较是使用hashcode的,他们的hashcode不同,那么自然被hashset认为是不一样的对象了,所以有了你的结果,建议record类里面写一个hashcode方法,可以利用Eclipse或MyEclipse的生成的那个hashcode算法
然后说说treeset
boss来了,等下给你补上
好了,boss走了,吓死我了
对于你的treeset,他是用compareTo方法判断是否相同,treeset要求你必须给record类实现comparable接口,你应该写了,但是这个接口有个方法compareTo你实现的时候可能是用了默认的吧,默认的compareTo方法只有一句,就是return 0;所以对于任何两个对象来说他们compareTo都是相同的,那么treeset就会认为这些record都是一样的,没区别,所以就只有一条
,建议可以利用下Eclipse或MyEclipse的equals算法生成,然后在compareTo方法里调用equals方法比较
综上所述
hashset用hashcode方法来实现比较是否相同
而treeset用comparable接口的compareTo方法比较
有问题可以追问,
打了这么多字给分吧~~
希望能帮助你
我人还是太好了,附带着还是把record的代码发给你吧,免得你迷糊
public class record implements Comparable{ private int age; private String name; public record(int age,String name){ // TODO Auto-generated constructor stub this.age=age; this.name=name; } @Override public int compareTo(Object o) { // TODO Auto-generated method stub if(equals(o)){ return 0; }else { return -1; } } @Override public String toString() { return "record [age=" + age + ", name=" + name + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; record other = (record) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } }
- java怎么判断两个Set 里的对象的值是否相同【两个set中的值是否相等】、java treeset和hashset如何判断元素是否相同【即对象是否完全相同;利用一个set去除重复元素】
- java积累---------java判断两个set里的对象值完全相同----两个set中的值是否相等
- java怎么判断两个Set 里的对象的值是否相同
- java怎么判断两个Set 里的对象的值是否相同
- Java中的Set接口,了解如何判断是否重复元素。
- 判断两个对象的值是否相等
- 通过set集合判断一个集合的元素是否重复
- 集合Set判断对象是否相等的equals和hashCode
- JavaScript 判断两个数组是否相等 或者 判断一个数组中是否有重复的元素
- HashSet如何判断加入的元素是否相同?
- 判断两个数组是否有相同元素
- 判断两个数组中是否含有相同的元素
- c语言:判断两个数组是否有相同的元素
- C语言判断两个数组是否有相同的元素
- C语言判断两个数组是否有相同的元素
- java中判断两个对象是否相等
- 判断java中两个对象是否相等
- 判断java中两个对象是否相等
- Android dpi的对应drawable,values文件处理
- javascript的执行顺序
- 需求模型RQM
- json用法
- 读写csv文件
- java怎么判断两个Set 里的对象的值是否相同【两个set中的值是否相等】、java treeset和hashset如何判断元素是否相同【即对象是否完全相同;利用一个set去除重复元素】
- 链表法HashMap解决hash冲突的方法
- 数组取值问题集去除括号问题
- UIImageView添加UITapGestureRecognizer后传参问题
- ListView的动态刷新问题——用notifyDataSetChanged没作用
- SDUTOJ 2079 悼念512汶川大地震遇难同胞 贪心
- (转载)Android数据库高手秘籍(五)——LitePal的存储操作
- caffe 安装和使用问题列表
- bfs与dfs