TreeSet的第一种排序方式,让元素自身具备比较性。
元素需要实现comparable接口,覆写compareTo方法。
TressSer第二种排序方式
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性,就定义了比较器。
定义一个类实现comparator 覆写compare方法。
TreeSet(Comparator<? super E> comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序
使用Comparator 的compare方法比较,
compare(T o1, T o2)
o1是要添加的元素, o2是集合中现有的元素。
元素需要实现comparable接口,覆写compareTo方法。
TressSer第二种排序方式
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性,就定义了比较器。
定义一个类实现comparator 覆写compare方法。
TreeSet(Comparator<? super E> comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序
使用Comparator 的compare方法比较,
compare(T o1, T o2)
o1是要添加的元素, o2是集合中现有的元素。
根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
如果两种方式都具备时,以比较器(comparator)为主
需求:
用姓名排序,姓名相同再比较年龄排序
import java.util.*;
/**/
class TreeSetDemo
{
public static void main(String [] args)
{
TreeSet ts=new TreeSet(new Mycompare());
ts.add(new Student("lisi09",40));
ts.add(new Student("lisi02",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",30));
Iterator it=ts.iterator();
while(it.hasNext())
{
Student s=(Student)it.next();
System.out.println(s.getName()+"...."+s.getAge());
}
}
}
class Mycompare implements Comparator
{
/*Mycompare上帝是Object已经继承了equals不用再覆盖了*/
public int compare(Object o1,Object o2)
{
Student s1=(Student)o1;
Student s2=(Student)o2;
int a=s1.getName().compareTo(s2.getName());//比较字符串,主要条件相同比较次要条件
if(a==0)
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
return a;
}
}
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;
}
}