黑马程序员技术交流社区
标题:
TreeSet相关知识梳理
[打印本页]
作者:
路文龙
时间:
2015-3-9 11:29
标题:
TreeSet相关知识梳理
一
、首先明确TreeSet与HashSet的区别:
1、底层实现不同:TreeSet通过TreeMap实现,数据结构为二叉树,HashSet通过HashMap实现,只通过key值来实现,数据结构为哈希表。
2、共同点是集合的唯一性。
3、不同点事TreeSet是有序的,HashSet是无序的关于HashSet的唯一性实现详见[url=学习分享 hashcode()与equals() 基于哈希表的集合HashSet
http://bbs.itheima.com/thread-174387-1-1.html
(出处: 黑马程序员IT技术论坛)]hashcode()与equals() 学习[/url]。
二、TreeSet有序性的实现方法
1、通过在定义类的时候实现Comparable接口来实现:
comparable实现类的子
compareable实现类.gif
(41.07 KB, 下载次数: 9)
下载附件
2015-3-9 11:11 上传
示例代码:
import java.util.*;
class TreeSetDemo2
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
ts.add(new Student("lisi0",30));
ts.add(new Student("lisixx",29));
ts.add(new Student("lisi9",29));
ts.add(new Student("lisi8",38));
ts.add(new Student("lisixx",29));
ts.add(new Student("lisi4",14));
//ts.add(new Student(39));
ts.add(new Student("lisi7",27));
System.out.println(ts);
}
}
//同姓名同年龄的学生视为同一个学生。按照学生的年龄排序。
class Student implements Comparable
{
private int age;
private String name;
Student(String name,int age)
{
this.age = age;
this.name = name;
}
public int compareTo(Object obj)
{
Student stu = (Student)obj;
int num = new Integer(this.age).compareTo(new Integer(stu.age));
return num==0?this.name.compareTo(stu.name):num;
/*
if(this.age>stu.age)
return 1;
if(this.age==stu.age)
return this.name.compareTo(stu.name);
return -1;
*/
/**/
}
public int getAge()
{
return age;
}
public String toString()
{
return name+"::"+age;
}
}
复制代码
但是,如果元素自身不具备比较性,或者元素自身具备的比较性,不是所需要的。
比如,学生的自然排序是按年龄排序,现在想要按照学生姓名排序。还可以不改动原有代码。
这时怎么办呢?
排序的第二种方式:自定比较器的方式。
这时可以让集合自身具备比较性。
可以定义一个类实现Comparator接口,覆盖compare方法。将该Comparator接口子类对象作为实际参数
传递给TreeSet集合构造函数。
该对象就是比较器。
import java.util.*;
class TreeSetDemo3
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new StudentComparatorByName());
ts.add(new Student("lisi0",30));
ts.add(new Student("lisixx",29));
ts.add(new Student("lisi9",29));
ts.add(new Student("lisi8",38));
ts.add(new Student("lisixx",29));
ts.add(new Student("lisi4",14));
//ts.add(new Student(39));
ts.add(new Student("lisi7",27));
System.out.println(ts);
}
}
class StudentComparatorByName implements Comparator
{
public int compare(Object o1,Object o2)
{
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int num = s1.getName().compareTo(s2.getName());
return num==0?new Integer(s1.getAge()).compareTo(new Integer(s2.getAge())):num;
}
}
//同姓名同年龄的学生视为同一个学生。按照学生的年龄排序。
class Student implements Comparable
{
private int age;
private String name;
Student(String name,int age)
{
this.age = age;
this.name = name;
}
public int compareTo(Object obj)
{
Student stu = (Student)obj;
int num = new Integer(this.age).compareTo(new Integer(stu.age));
return num==0?this.name.compareTo(stu.name):num;
/*
if(this.age>stu.age)
return 1;
if(this.age==stu.age)
return this.name.compareTo(stu.name);
return -1;
*/
/**/
}
public int getAge()
{
return age;
}
public String getName()
{
return name;
}
public String toString()
{
return name+"::"+age;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2