A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

大家看看 下面改写的代码

主程序
private static void demo1() {
                Set<Person> set = new TreeSet<Person>();
               
                set.add(new Person("张三", 19));
                set.add(new Person("李四", 20));
                set.add(new Person("王五", 18));
                set.add(new Person("赵六", 21));
                set.add(new Person("孙七", 21));
               
                System.out.println(set);
        }

Person类的中改写的compareTo方法
public int compareTo(Person p) {
          int ageGap =   this.age - p.age;
          return ageGap != 0 ?  ageGap : this.name.compareTo(p.name);
}

上面方法this 是第一个传入的  而 p是第二或三或四...个传入 那么不是应该用 p.age - this.age 吗 求解

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
本帖最后由 周素强 于 2012-5-8 15:48 编辑

TreeSet类:底层数据结构是二叉树,可以对集合中的元素进行排序。

TreeSet元素唯一性和排序(为主)的原因,是通过compareTo()方法对元素进行比较,是TreeSet集合对元素排序的依据,此方法的返回值是正数,负数,零,这个方法是Comparable接口中的。

注意:

第一种排序方式:自定义类,然后向TreeSet集合中存入自定义类的对象时,需要在自定义类中实现(implements)Comparable接口并在类中重写compareTo()方法形成自己的比较方法,另外需要注意的是在重写compareTo方法(排序)当主要条件相同时,一定要判断一下次条件(否则会视为重复元素,不会存入集合中)。

第二种排序方式:当元素(自定义类中的compareTo方法)自身不具备比较性时,或具备的比较性不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时,就具备比较方式,所以需定义比较器(定义类实现Comparator接口,在类中重写compare(Object o1,Object o2)方法描述比较代码)传递(比较器的对象)给TreeSet集合的构造函数。

注:两种比较方式同时出现时,以比较器为先。

public int compareTo(Object obj)//要重写此方法必需要保证与Comparable接口中的方法一致
{
          if(!(obj instanceof Person))//这里最好对传过来obj与Person进行一下判断,判断是否是Person对象
                   throw new RuntimeException("类型不匹配");
          Person p = (Person)obj;//要进行一下强转
          int ageGap =   this.age - p.age;
          return ageGap != 0 ?  ageGap : this.name.compareTo(p.name);
}

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
java常用集合的两大派系一类Collection,一类是Map。而Collection常用的子接口有List和Set。其中List集合元素的特点是存储是有序且可以重复,而Set集合元素则是无序且不重复的。但Set集合保证不重复是有前提的:HashSet集合是通过存放元素所在类的hashCode()和equals()方法来保证元素的唯一性;TreeSet集合在存储元素时会将元素进行排序存储,这就要求有个前提:让元素具有可比较性(自然顺序即元素所在类要实现Comparable接口并实现compareTo()方法)或者让集合自身具备比较功能即在创建集合时给集合指定比较器。在楼主提供的代码中this代表的是要存入的对象元素引用,p代表之前存入的元素引用。比如在执行set.add(new Person("李四", 20))的时候,this代表的就是new Person("李四", 20)这个Person对象的引用,p就代表之前new Person("张三", 19)这个Person对象的引用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马