|——HashSet:数据结构哈希表,线程非同步,
|——TreeSet:可以对Set集合中元素进行排序,默认排序是字母自然顺序
需求:往TressSet集合中存储自定义对象
按照学生年龄排序
import java.util.*;
/*
*/
class TreeSetDemo
{
public static void main(String [] args)
{
TreeSet tb=new TreeSet();
tb.add(new Student("lisi02",22));
tb.add(new Student("lisi007",20));
tb.add(new Student("lisi09",19));
tb.add(new Student("lisi01",40));
/*
运行抛出ClassCastException:Student cannot be cast to java.lang.Comparable异常,当第一个元素存储时,因为集合为空不需要比较排序
而第二个元素存储时,需要和集合中元素比较排序,内部有一个检查元素是否具备比较性的
方法,就是强制类型转换,不具备比较性抛异常。
元素排序:就是利用元素本身的CompareTo方法和集合中的现有元素比较大小,然后排序
显然Student对象不具备此方法,所以需要实现Comparable接口,并实现compareTo方法。
字符串之所以可以排序,是因为它已经实现了Comparable
也就是说对象必须实现comparable才能比较排序
*/
Iterator it=tb.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
class Student
{
private String name;
private int age;
Student(String name ,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
所以需要使对象具备比较性 实现Comparable接口
class Student implements Comparable
{
private String name;
private int age;
Student(String name ,int age)
{
this.name=name;
this.age=age;
}
public int compareTo(Object obj)
{
if(!(obj instanceof Student))/*其返回true情况如下1.obj是student类的对象2.obj是student类子类的对象 */
throw new RuntimeException("不属于stduent类");
Student s=(Student)obj;
if(this.age > s.age)
return 1;
if(this.age ==s.age)//当主要条件相等时判断次要条件
{
return this.name.compareTo(s.getName());
}
return -1;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
完成代码如下
import java.util.*; /* */ class TreeSetDemo
{
public static void main(String [] args)
{
TreeSet ts=new TreeSet();
ts.add(new Student("lisi02",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi01",40));
ts.add(new Student("lisi09",40));
Iterator it=ts.iterator();
while(it.hasNext())
{
Student s=(Student)it.next();
System.out.println(s.getName()+"...."+s.getAge());
}
}
}
class Student implements Comparable
{
private String name;
private int age;
Student(String name ,int age)
{
this.name=name;
this.age=age;
}
public int compareTo(Object obj)
{
if(!(obj instanceof Student))
throw new RuntimeException("不属于stduent类");
Student s=(Student)obj;
if(this.age > s.age)
return 1;
if(this.age ==s.age)
{
return this.name.compareTo(s.getName());
}
return -1;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}