排序容器_TreeSet与TreeMapJAVA127

来源:http://www.bjsxt.com/
1、S02E127_01排序容器_TreeSet与TreeMap
(1)TreeSet:数据元素可以排序且不可重复
对比:Set接口子类HashSet,元素必须重写hashcode和equals方法。
去重:不用重写hashcode和equals方法,比较等于0即重复。
实现:两种
——元素实体可以排序:java.lang.Comparable + compareTo

new TreeSet()时体现
package com.test.sort.collection;

import java.util.TreeSet;

public class Worker implements 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 String toString() {
        return "工种:" + type + ",工资:" + salary + "\n";
    }
    @Override
    public int compareTo(Worker o) {
        return (this.salary-o.salary>0) ? 1 : (this.salary==o.salary?0:-1);
    }
    public static void main(String[] args) {
        Worker worker1 = new Worker("垃圾回收员", 12000);
        Worker worker2 = new Worker("农民工", 10000);
        Worker worker3 = new Worker("程序猿", 5000);
        TreeSet<Worker> workers = new TreeSet<Worker>();
        workers.add(worker1);
        workers.add(worker2);
        workers.add(worker3);
        System.out.println(workers.toString());
    }

}

——排序业务类:java.util.Comparator + compare

new TreeSet(Comparator<? super E> comparator)时体现

注意:TreeSet在添加数据时排序,数据更改不会影响原来的顺序。不要修改数据,否则可能重复(加final可使数据不可修改)

package com.test.sort.collection;

import java.util.Comparator;
import java.util.TreeSet;

public class Person {

    private final String name;//姓名/加final用于不可修改,因为修改可能使用数据重复
    private final int handsome;//帅气指数/加final用于不可修改,因为修改可能使用数据重复
    public Person() {
        name = null;
        handsome = 0;
    }
    public Person(String name, int handsome) {
        super();
        this.name = name;
        this.handsome = handsome;
    }

    public String getName() {
        return name;
    }
    public int getHandsome() {
        return handsome;
    }
    @Override
    public String toString() {
        return "姓名:" + name + ",帅气指数:" + handsome + "\n";
    }

    public static void main(String[] args) {
        Person p1 = new Person("你", 100);
        Person p2 = new Person("刘德华", 1000);
        Person p3 = new Person("梁朝伟", 1200);
        Person p4 = new Person("老师", 50);

        //使用排序的业务类(匿名内部类)
        TreeSet<Person> persons = new TreeSet<Person>(
                new Comparator<Person>() {
                    public int compare(Person o1, Person o2) {
                        return o1.getHandsome() - o2.getHandsome();
                    };
                }
                );
        persons.add(p1);
        //TreeSet在添加数据时排序,不是添加完才排序
        persons.add(p2);
        persons.add(p3);
        persons.add(p4);
        System.out.println(persons.toString());
        /*属性不加fina前
        //数据更改不会影响原来的顺序
        p4.setHandsome(100);
        p4.setName("你");
        //p4与p1内容重复,即TreeSet数据存在重复
        System.out.println(persons.toString());
        */
    }
}

(2)TreeMap:确保key可以排序或者提供比较器
——key可以排序

public TreeMap()时体现

与TreeSet同理

        //使用排序的业务类(匿名内部类)
        TreeMap<Person2,String> persons = new TreeMap<Person2,String>(
                new Comparator<Person2>() {
                    public int compare(Person2 o1, Person2 o2) {
                        return o1.getHandsome() - o2.getHandsome();
                    };
                }
                );
        persons.put(p1,"a");
        persons.put(p2,"a");
        persons.put(p3,"a");
        persons.put(p4,"a");
        System.out.println(persons.toString());

——提供key比较器

public TreeMap(Comparator<? super K> comparator)时体现

与TreeSet同理

        TreeMap<Worker2,String> workers = new TreeMap<Worker2,String>();
        workers.put(worker1,"a");
        workers.put(worker2,"a");
        workers.put(worker3,"a");
        System.out.println(workers.toString());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值