Java -- 排序03(TreeSet 和 TreeMap)

Java – 排序03(TreeSet 和 TreeMap)

一.TreeSet
1.特性:数据元素可以排序,但不可重复
2.对比:与HashSet相比,TreeSet不用重写Hashcode和equals
3.去重:比较等于0即重复
4.排序:与上一章中提到的一样,要么用Comparable,要么用Comparator,代码如下
  注:TreeSet是在添加数据的时候排序,修改数据后不改变排序
      可以将属性常量化,这样就可以避免修改数据的情况发生 

(1)运用Comparator
public class Person {
    String name;
    int handsome;

    public Person(String name, int handsome) {
        this.name = name;
        this.handsome = handsome;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("姓名: " +  name);
        sb.append("帅气指数:" + handsome);
        sb.append("\n");
        return sb.toString();
    }
}
public class Test01 {
    public static void main(String[] args) {
        Person per1 = new Person("soledad",100000);
        Person per2 = new Person("刘德华",1000);
        Person per3 = new Person("梁朝伟",10000);

        //用Comparator来解决,按帅气指数降序排序
        TreeSet<Person> persons = new TreeSet<Person>(
                new Comparator<Person>(){
                    @Override
                    public int compare(Person o1, Person o2) {
                        return -(o1.handsome - o2.handsome) ;
                    }
                }
        );
        persons.add(per1);
        persons.add(per2);
        persons.add(per3);

        System.out.println(persons.toString());
        per1.handsome = -100;
        System.out.println("==============================================");
        System.out.println(persons.toString());
    }
}
打印结果:
[姓名: soledad帅气指数:100000
, 姓名: 梁朝伟帅气指数:10000
, 姓名: 刘德华帅气指数:1000
]
=========================================================================
[姓名: soledad帅气指数:-100
, 姓名: 梁朝伟帅气指数:10000
, 姓名: 刘德华帅气指数:1000
]
(2)运用Comparable
public class Worker implements Comparable<Worker> {
    String type;
    double salary;

    public Worker() {
    }

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

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

    @Override
    public String toString() {
        return "Worker{" +
                "type='" + type + '\'' +
                ", salary=" + salary +
                '}';
    }
}
public class Test02 {
    public static void main(String[] args) {
        //按照工资降序排列
        Worker worker = new Worker("程序员",10000);
        Worker worker2 = new Worker("律师",20000);
        Worker worker3 = new Worker("会计师",30000);

        TreeSet<Worker> workers = new TreeSet<Worker>();
        workers.add(worker);
        workers.add(worker2);
        workers.add(worker3);

        System.out.println(workers.toString());

    }
}
打印:
[Worker{type='会计师', salary=30000.0}, Worker{type='律师', salary=20000.0}, Worker{type='程序员', salary=10000.0}]
以上结果表明,TreeSet是在添加数据的时候排序,修改数据后不改变排序
不过,可以将属性常量化(final),这样就可以避免修改数据的情况发生

二.TreeMap

1.特性:确保键(key)可以排序,或者提供比较器
  (1)确保key可以排序
  (2)提供key比较器
  比较方法同TreeSet一样,分为Comparator和Comparable
    public class TreeMap01 {
        public static void main(String[] args) {
            Person per1 = new Person("soledadv",100000);
            Person per2 = new Person("刘德华",1000);
            Person per3 = new Person("梁朝伟",10000);


            //用提供额外的业务类的方法对TreeMap进行比较,按帅气指数降序排列
            TreeMap<Person, String> persons = new TreeMap<Person,String>(
                    new Comparator<Person>(){
                        @Override
                        public int compare(Person o1, Person o2) {
                            return -(o1.handsome - o2.handsome);
                        }
                    }
            );
            persons.put(per1,"大帅哥");
            persons.put(per2,"大帅哥");
            persons.put(per3,"大帅哥");


            System.out.println(persons.keySet());//查看键的排序

        }
    }

public class TreeMap02 {
    public static void main(String[] args) {
        //按照工资降序排列
        Worker worker = new Worker("程序员",10000);
        Worker worker2 = new Worker("律师",20000);
        Worker worker3 = new Worker("会计师",30000);


        TreeMap<Worker,String> workers = new TreeMap();
        workers.put(worker,"钱多话少死得早");
        workers.put(worker2,"钱多话少死得早");
        workers.put(worker3,"钱多话少死得早");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值