java怎么判断两个Set 里的对象的值是否相同【两个set中的值是否相等】、java treeset和hashset如何判断元素是否相同【即对象是否完全相同;利用一个set去除重复元素】
2015-01-19 15:03
2546 查看
文章来源:http://blog.csdn.net/lxqluo/article/details/31394393
问:
答:
我想看下你得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的代码发给你吧,免得你迷糊
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; }
java treeset和hashset如何判断元素是否相同
问:在使用treeset和hashset重复添加元素时,发现二者在比较自定义对象元素上不一样,如下例 假设record对象包含两个信息,一个为int age,一个为String name Set<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积累---------java判断两个set里的对象值完全相同----两个set中的值是否相等
- java怎么判断两个Set 里的对象的值是否相同
- java怎么判断两个Set 里的对象的值是否相同
- 学习体会:在JAVA中如何判断两个对象是否相等
- Java判断一个值,或者对象是否存在list集合中和去掉list集合中重复的元素
- java中如何高效判断两个容器是否有相同元素(时间复杂度为O(1))
- JAVA基础之——HashSet中是如何判断元素是否重复的
- JavaScript 判断两个数组是否相等 或者 判断一个数组中是否有重复的元素
- Java中的Set接口,了解如何判断是否重复元素。
- Java中如何判断两个对象是否相等(Java equals and ==)
- 在java的集合中是怎么判断两个对象是否相等的?(重要!)
- HashSet如何判断加入的元素是否相同?
- HashSet中是如何判断元素是否重复的
- java 对象比较 判断两个对象的某些或某个属性相同 这对象相等。
- 利用java反射机制比较同一个bean的两个对象的值是否相同
- c#如何判断两个对象是否相等
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- JAVA如何判断两个字符串是否相等
- 用Java代码写一个判断两个二叉树是否相同