黑马程序员技术交流社区
标题:
TreeSet中的compareTo改写 码表的比较 有点不明白
[打印本页]
作者:
宗士为
时间:
2012-5-8 15:13
标题:
TreeSet中的compareTo改写 码表的比较 有点不明白
大家看看 下面改写的代码
主程序
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 吗 求解
作者:
周素强
时间:
2012-5-8 15:38
本帖最后由 周素强 于 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);
}
作者:
杨鹏
时间:
2012-5-8 19:53
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对象的引用。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2