本帖最后由 yuli2039 于 2014-7-26 23:16 编辑
关于TreeSet的问题,在元素自身具备比较功能的情况下,集合自定了比较器并调用,但是存入元素失败,求大神解答!!!使用自身比较功能能够正常存入
import java.util.*;
class Student implements Comparable //定义了Student 类实现了Comparable 接口,元素自身具备比较性!
{
String name;
int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public boolean equals(Object obj)//此处复写了equals方法,如果使用HashSet集合,需要调用此方法
{
if (!(obj instanceof Student))
return false;
Student s =(Student)obj;
return this.name.equals(s.name) && this.age==s.age;
}
public int hashCode()//此处复写了hashCode方法,如果使用HashSet集合,需要调用此方法
{
return this.name.hashCode()+this.age*23;
}
public int compareTo(Object obj)//复写compareTo方法,让元素自身具备比较性(先比name,如果一致,比较age)
{
if (!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s =(Student)obj;
if (this.name.equals(s.name))
{
Integer tage=this.age;
Integer sage=s.age;
return tage.compareTo(sage);
}
return this.name.compareTo(s.name);
}
public String getName()//获取name
{
return name;
}
public int getAge()//获取age
{
return age;
}
}
class MyCompare implements Comparator//自定义比较器,若元素自带比较功能不适用,可适用自定的比较方法(先比age,如一致,再比name)
{
public int compare(Object o1,Object o2)
{
Student s1=(Student)o1;
Student s2=(Student)o1;
Integer i1=s1.getAge();
Integer i2=s2.getAge();
int num= i1.compareTo(i2);
if (num==0)
return s1.getName().compareTo(s2.getName());
return num;
}
}
class TreeSetTest
{
public static void main(String[] args)
{
TreeSet h=new TreeSet(new MyCompare());//此处建立TreeSet集合,调用自定比较器!为什么只存进去了一个"wangli1",18,其他的都没有存进去,使用元素自身的比较功能可以正常存入!!!!
h.add(new Student("wangli1",18));
h.add(new Student("wangli2",19));
h.add(new Student("wangli3",20));
h.add(new Student("wangli2",30));
h.add(new Student("wangli3",25));
Iterator it=h.iterator();
while (it.hasNext())
{
Student s=(Student)it.next();
System.out.println(s.getName()+"......"+s.getAge());
}
}
}
|
|