treeset的使用(Comparable接口和Compartor接口的使用)

来源:互联网 发布:在线算法平台 编辑:程序博客网 时间:2024/05/16 08:10

TreeSet:

实现了Set接口。

会给Set集合中的元素进行指定方式的排序。

底层数据结构是:二叉树(参考红黑树)。
 
    排序的第一种方式:
    让元素自身具备比较性。让放入TreeSet中的元素类实现Comparable接口,覆盖compareTo方法。TreeSet会调用元素的compareTo方法排序元素。
            
package test;
import java.util.*;

class Hee  
{
    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("lisi7",27)); 
 
        System.out.println(ts);
    }
}
 
//按照学生的年龄排序。
class Student implements Comparable<Student>
{
    private int age;
    private String name;
    Student(String name,int age)
    {
        this.age = age;
        this.name = name;
    }
 
    public int compareTo(Student stu)
    {        
                    
        if(this.age>stu.age)
            return 1;
        if(this.age==stu.age)
            return this.name.compareTo(stu.name);
        return -1;               
    }
    
    public String toString()
    {
        return name+":"+age;
    }

}

结果:

[lisi4:14, lisi7:27, lisi9:29, lisixx:29, lisi0:30, lisi8:38]



        排序的第二种方式:自定比较器的方式。
           这时可以让集合自身具备比较性。
          可以定义一个类实现Comparator接口,覆盖compare方法。将该Comparator接口子类对象作为实际参数传递给TreeSet集合构造函数。TreeSet自动根据Comparator子对象的compare方法来对集合中的对象排序。

package test;
import java.util.*;

class Hee  
{
    public static void main(String[] args)  
    {
        TreeSet ts = new TreeSet(new StudentByName());
 
        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("lisi7",27)); 
 
        System.out.println(ts);
    }
}
 
class Student 
{
    private int age;
    private String name;
    Student(String name,int age)
    {
        this.age = age;
        this.name = name;
    } 
       
    public String toString()
    {
        return name+":"+age;
    }
    public int getAge()
    {
        return age;
    }
    public String getName()
    {
        return name;
}}
class StudentByName implements Comparator<Student>
{
    public int compare(Student s1,Student s2)
    {
         int num = new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
        return num==0 ? s1.getName().compareTo(s2.getName()):num;
    }
}

结果:

[lisi4:14, lisi7:27, lisi9:29, lisixx:29, lisi0:30, lisi8:38]


总结: 
单点解释吧:用自定义类实现Comparable接口,那么这个类就具有排序功能,Comparable和具体你要进行排序的类的实例邦定。而Comparator比较灵活,只需要通过构造方法指定一个比较器就行了实现它的自定义类仅仅定义了一种排序方式或排序规则。不言而喻,这种方式比较灵活。我们的要排序的类可以分别和多个实现Comparator接口的类绑定,从而达到可以按自己的意愿实现按多种方式排序的目的。Comparable——“静态绑定排序”,Comparator——“动态绑定排序”。 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肠粉蒸出来太粘怎么办 微信订阅号没了怎么办 映美620k不进纸怎么办 属虎的带了貔貅怎么办 属龙的不能带金怎么办 这段时间运气不好怎么办 两年运气特别差怎么办 玩手机麻将老输怎么办 打四川麻将老输怎么办 网上打麻将老输怎么办 手机打麻将老输怎么办 近来打麻将老输怎么办 最近手气不好老输钱怎么办 头被风吹了头痛怎么办 打麻将老输怎么办转运 外出时家里的花怎么办 放假了家里的花怎么办 老是怀疑老婆有外遇怎么办 老婆出轨我该怎么办呢 老公爱爱时间短怎么办 老婆离家出走了怎么办离婚呢 4g网络变成h了怎么办 打麻药伤到神经怎么办 40多岁乳房下垂怎么办 手冻了怎么办 小妙招 脸过敏好了还红怎么办 脸过过敏红肿痒怎么办 腰间盘突出压迫神经腿麻怎么办 腰椎盘突出脚麻怎么办 水泡破了化脓了怎么办 泰迪口臭很严重怎么办 狗狗的嘴巴好臭怎么办 2岁宝宝有口臭怎么办 2岁半宝宝口臭怎么办 胃热引起的口臭怎么办 脑梗右手不能动怎么办 脑梗右手不灵活怎么办 冒冷汗头晕想吐怎么办 脸中风嘴歪了怎么办 耳朵里疱疹破了怎么办 吃了变质的米饭怎么办