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; }

java treeset和hashset如何判断元素是否相同

问:
在使用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;    }     }



0 0
原创粉丝点击