黑马程序员训练营---------TreeSet集合中对象进行排序的两种方式

时间:2022-07-12 00:17:12
 

                         
                                         ---------------------------  中关村黑马程序员训练营 --------------------------------

                                               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;
 }

}