--------------------------- 中关村黑马程序员训练营 --------------------------------
TreeSet集合中对象进行排序的两种方式
.------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
在collection集合的子类set集合中子类TreeSet集合:可以对Set集合中的元素进行排序。其底层数据结构是二叉树。
TreeSet集合如何对对象进行排序?
TreeSet集合对元素排序有两种方式;
第一种自然排序:元素(对象)自身具备比较性。元素(对象)需要实现implements Comparable接口,并覆盖接口的public int compareTo(Object obj)功能方法函数。
之后元素(对象)才能进行排序。 也种方式也成为元素的自然顺序,或者叫做默认顺序。
让元素所属的类实现自然排序的接口Comparable,并重写int compateTo()方法
用无参构造方法public TreeSet(),TreeSet<Student> ts = new TreeSet<Student>()
public TreeSet()无参构函,元素按自然顺序进行排序
* 让元素所属的类实现 接口Comparable<T> 重写int compareTo(T o)方法,按自然顺序排序,
public int compareTo(Object obj){return this.age-s.age;} return 0,元素是重复
第二种比较器排序:当元素自身不具备比较性时,或者元素具备的比较性不是所需要的。这时就需要让集合自身具备比较性。自定义一个比较器,
并将比较器对象作为参数传递给TreeSet集合的构造函数的心建立的对象 new Tree()。
用比较器 Comparator排序(集合具备比较性)
让集合的带参构造方法public TreeSet(Comparator comparator),传入 比较器接口的实现子类对象comparator = new MyComparator()
TreeSet<Student> ts = new TreeSet<Student>( new MyComparator())
public TreeSet(Comparator comparator)带参构函,参数是个接口, 根据指定比较器接口comparator进行排序
* Comparator 是个接口指向实现具体子类 多态 抽象方法 int compare(T o1, T o2)
* Comparator comparator = new MyComparator(), 并重写int compare(T o1, T o2)方方法
* 方法的参数是个接口 Comparator,要的是其实现子类 new MyComparator(),
* 另建一个实现子类MyComparator,实现接口Comparator 重写int compare(T o1, T o2)方方法
第一种方式
import java.util.*;
class Tree2
{
public static void sop(Object obj)
{System.out.println(obj);}
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
ts.add(new Student("lishi01",10));
ts.add(new Student("lishi01",10));
ts.add(new Student("lishi06",80));
ts.add(new Student("lishi06",90));
ts.add(new Student("lishi02",20));
ts.add(new Student("lishi06",20));
ts.add(new Student("lishi03",30));
ts.add(new Student("lishi04",40));
ts.add(new Student("lishi05",50));
sop(ts);
Iterator it =ts.iterator();
while(it.hasNext())
{
Student stu =(Student)it.next();
sop(stu.getName()+"......."+stu.getAge());
}
}
}
class Student implements Comparable
{ 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的 public int compareTo(Object obj)功能方法函数。
public int compareTo(Object obj)
{ Student s =(Student)obj;
if ( !(obj instanceof Student))
throw new RuntimeException("obj 实现的不是学生类");
if(this.age>s.age)
return 1;
if(this.age==s.age)
return this.name.compareTo(s.name);
return -1;
}
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetDemo3 {
public static void main(String[] args) {
// TreeSet<Student> ts = new TreeSet<Student>();
//TreeSet(Comparator<? super E> comparator) 带参构造方法,指向具体实现子类 Comparator comparator = new myComparator()
//TreeSet<student> ts = new TreeSet<Student>(new myComparator())
// TreeSet<Student1> ts = new TreeSet<Student1>(new myComparator()); //外部类 多次调用
//只调用一次,用匿名内部类,也能完成,不用另建接口的实现类麻烦,减少代码改动时麻烦
TreeSet<Student1> ts = new TreeSet<Student1>( new Comparator<Student1>() {
@Override//重写 compare方法,因为不在同一类中,所有要用 getName()和getAge()方法
public int compare(Student1 s1, Student1 s2) {
//主要条件,比较元素姓名的长度(相减),长度不同添加进去
int num = s1.getName().length()-s2.getName().length(); //return num
//次要条件 比较元素姓名的内容是否相同(用compareTo), 姓名内容不同添加进去
int num2 = (num==0?s1.getName().compareTo(s2.getName()):num); //return num2
//次次要条件,元素姓名长度和内容相同,再比较年龄是否相同(相减),不同添加进去
int num3 = (num2==0?s1.getAge()-s2.getAge():num2);
return num3;}
} );
Student1 s1= new Student1("ab",20);
Student1 s2 = new Student1("ab",20);
Student1 s4 = new Student1("ab",22);
Student1 s6 = new Student1("ab",31);
Student1 s5 = new Student1("bc",41);
Student1 s22 = new Student1("abcde",20);
Student1 s23 = new Student1(" bcde",20);
Student1 s21 = new Student1("abc",20);
Student1 s24 = new Student1("abc",21);
Student1 s3 = new Student1("bcd",25);
ts.add(s1);
ts.add(s2);
ts.add(s21);
ts.add(s22);
ts.add(s23);
ts.add(s24);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
//for获取元素
for(Student1 s:ts){
System.out.println(s.getName()+"..."+s.getAge());
}
}
}
public class Student1 {
private String name;
private int age;
public Student1() { super();}
public Student1(String name, int age) {
super();
this.name = name;
this.age = age; }
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getAge() {return age;}
public void setAge(int age) { this.age = age;}
import java.util.Comparator;
public class myComparator implements Comparator<Student1> {
@Override//重写 compare方法,因为不在同一类中,所有要用 getName()和getAge()方法
public int compare(Student1 s1, Student1 s2) {
//主要条件,比较元素姓名的长度(相减),长度不同添加进去
int num = s1.getName().length()-s2.getName().length(); //return num
//次要条件 比较元素姓名的内容是否相同(用compareTo), 姓名内容不同添加进去
int num2 = (num==0?s1.getName().compareTo(s2.getName()):num); //return num2
//次次要条件,元素姓名长度和内容相同,再比较年龄是否相同(相减),不同添加进去
int num3 = (num2==0?s1.getAge()-s2.getAge():num2);
return num3;
}
}