TreeSet和TreeMap的使用(实现Comparable和Comparator接口)

目录

  • TreeSet,TreeMap实现Comparator实现排序
  • TreeSet,TreeMap实现Comparable实现排序

TreeSet,TreeMap实现Comparator实现排序

>

(1).TreeSet:
数据元素可以排序(且不需要自己排序,只要自己实现相应的接口(Comparable|Comparator)就可以了)
不可重复性
对比: Set接口: HashSet :元素必须重写hashCode()和equals方法
去重: 比较等于0即重复
1) 元素可以排序: java.lang.Comparable + compareTo
2) 排序业务类 java.util.Comparator + compare
new TreeSet(Comparator < ? super E)
注意 : TreeSet在添加数据时排序 : 数据更改不会影响原来的顺序
TreeSet在使用的过程中不要修改数据,否则可能重复
2.TreeMap
要求键可以排序,与上TreeSet同理

这里先给出一个Person实体类,方便下面使用

public class Person {
    private final String name;   //名字
    private final int handsome;  //帅气指数

    public Person() {   //默认的构造函数 : 初始化时 给定一个值 : 之后数据不会更改
        name = null; 
        handsome = 0;
    }

    public Person(String name, int handsome) {
        super();
        this.name = name;
        this.handsome = handsome;
    }
    /* 数据不可更改
    public void setName(String name) {
        this.name = name;
    }
    public void setHandsome(int handsome) {
        this.handsome = handsome;
    }
    */
    public String getName() {
        return name;
    }
    public int getHandsome() {
        return handsome;
    }
    public String toString() {
        return "姓名:" + this.name + " -->帅气指数 : " + this.handsome + "\n";
    }
}

使用Comparator和TreeSet

import java.util.Iterator;
import java.util.TreeSet;

/**
 * java.util.Comparator + TreeSet
 */


public class TreeSetDemo01 {
    public static void main(String[] args) {
        Person p1 = new Person("zx", 100);
        Person p2 = new Person("刘德华", 1000);
        Person p3 = new Person("梁朝伟", 1500);
        Person p4 = new Person("王力宏", 1300);

        // 依此存放到TreeSet()中 
        //TreeSet()中,Person类不能直接转换成Comparable类,元素必须可以排序
        //这里使用排序的业务类(匿名内部类)
        TreeSet<Person> persons = new TreeSet<Person>(
                new java.util.Comparator<Person>() {
                    @Override
                    public int compare(Person o1, Person o2) { //重写compare方法
                        return o1.getHandsome() - o2.getHandsome(); //升序排列
                    }
                }
            );

        persons.add(p1);
        //TreeSet在添加数据时排序
        persons.add(p2);
        persons.add(p3);
        persons.add(p4);


        //访问方式一 : 遍历
        System.out.println("----------使用迭代器遍历--------------");
        for(Iterator it = persons.iterator();it.hasNext(); ) {
            Person p = (Person)it.next();
            System.out.println(p.getName() + " --> " + p.getName());
        }

        //TreeSet使用过程中不改值
        //p3.setHandsome(100);//在这里把数据更改,但是TreeSet容器中的顺序不会改变
        //使用重写toString直接输出
        System.out.println("--------------使用重写类中的toString()方法查看----------");
        System.out.println(persons);
        /*
        //p3.setName("郑鑫"); //TreeSet使用过程中数据尽量不要重复
        System.out.println("--------------修改数据后TreeSet中数据重复---------");
        System.out.println(persons);
        */
    }

}

使用Comparator和TreeMap

import java.util.Set;
import java.util.TreeMap;

/**
 * Comparator + TreeMap
 * @author 郑鑫
 *
 */
public class TreeMapDemo01 {
    public static void main(String[] args) {
        Person p1 = new Person("郑鑫", 100);
        Person p2 = new Person("刘德华", 1000);
        Person p3 = new Person("梁朝伟", 1500);
        Person p4 = new Person("王力宏", 1300);

        TreeMap<Person,String>map = new TreeMap<Person,String>(
                new java.util.Comparator<Person>() {
                    @Override
                    public int compare(Person o1, Person o2) {
                        return -(o1.getHandsome() - o2.getHandsome());
                    }
                }
            );

        map.put(p1, "bjsxt");
        map.put(p2, "bjsxt");
        map.put(p3, "bjsxt");
        map.put(p4, "bjsxt");
        Set<Person>persons = map.keySet();
        System.out.println(persons);

    }
}

TreeSet,TreeMap实现Comparable实现排序

同上面,也先给出一个Worker实体类(业务排序类,实现Comparable接口)

/**
 * 提供了解耦的方式 : 业务排序类
 * @author 郑鑫
 *
 */

public class Worker implements java.lang.Comparable<Worker> {
    private String type; //工种
    private double salary;

    public Worker() {}

    public Worker(String type, double salary) {
        super();
        this.type = type;
        this.salary = salary;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public int compareTo(Worker o) {
        return this.getSalary() > o.getSalary() ? 1 :(this.getSalary() == o.getSalary() ? 0 : -1);
    }

    @Override
    public String toString() {
        return "工种 : " + this.type + " 工资  : " + this.salary + "\n";
    }

}

使用Comparable + TreeSet

import java.util.TreeSet;

/**
 * 测试 TreeSet + java.lang.Comparable
 * 实体类实现Comparable接口的应用 
 * @author 郑鑫
 */
public class TreeSetDemo02 {
    public static void main(String[] args) {
        Worker w1 = new Worker("农名工",1000);
        Worker w2 = new Worker("公务员",3000);
        Worker w3 = new Worker("程序员",5000);

        TreeSet<Worker>employee = new TreeSet<Worker>();

        employee.add(w1); //如果没有实现java.util.Comparable且重写comepareTo方法,就会报错
        employee.add(w2);
        employee.add(w3);

        System.out.println(employee);  

    }
}

使用Comparable + TreeMap

import java.util.TreeMap;

/**
 * TreeMap + Comparable
 * @author 郑鑫
 */
public class TreeMapDemo2 {
    public static void main(String[] args) {
        Worker w1 = new Worker("农名工",1000);
        Worker w2 = new Worker("公务员",3000);
        Worker w3 = new Worker("程序员",5000);

        TreeMap<Worker,String>employee = new TreeMap<Worker,String>();

        employee.put(w1,"bjsxt"); //如果没有实现java.util.Comparable且重写comepareTo方法,就会报错
        employee.put(w2,"bjsxt");
        employee.put(w3,"bjsxt");

        System.out.println(employee.keySet()); 
    }
}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值