Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >java中的排序--排序容器_TreeSet与TreeMap

java中的排序--排序容器_TreeSet与TreeMap

作者头像
wfaceboss
发布于 2019-04-08 02:27:20
发布于 2019-04-08 02:27:20
1.8K00
代码可运行
举报
文章被收录于专栏:wfacebosswfaceboss
运行总次数:0
代码可运行

1.TreeSet:数据元素可以排序且不可重复。

对比:

(1)Set接口:HashSet,元素必须重写hashcode和equals方法。

(2)TreeSet:只要可以排序即可。去重:比较等于0即重复。

TreeSet数据排序两种方式:

注意:TreeSet是在添加数据时进行排序,数据更改不会影响原来的顺序,因此不能修改类中数据,否则可能重复。需要在设计类时使用final修饰字段属性,同时不提供相应set、get方法。

1)、若选用无参的new TreeSet()构造器,需要元素本身可以排序方能使用,也即实体类实现java.lang.Comparable接口重写compareTo接口。

 (1)新建一个实现java.lang.Comparable接口并重写comparaTo方法的实体类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package top.wfaceboss.caseSort02;

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.salary > o.salary ? 1 : (this.salary == o.salary ? 0 : -1);
    }

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

}

(2)使用无参的new TreeSet()构造器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package top.wfaceboss.caseSort02;

import java.util.TreeSet;

public class TreeSetDemo {
    public static void main(String[] args) {
        Worker w1 = new Worker("垃圾回收员", 5000);
        Worker w2 = new Worker("农工", 2000);
        Worker w3 = new Worker("程序员", 10000);

        TreeSet<Worker> employee = new TreeSet<Worker>();
        employee.add(w1);
        employee.add(w2);
        employee.add(w3);
        System.out.println(employee);
    }
}

结果为:

2)、若选用带参的new TreeSet(Comparator<? super E> comparator)构造器,需要提供额外的排序业务类(匿名内部类的方式)实现java.util.Comparator接口,重写compare方法。

   (1)新建一个没有实现java.lang.Comparable接口的实体类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package top.wfaceboss.caseSort;

public class Person {
    private final String name;
    private final int hangsome;

    public Person() {
        name = null;
        hangsome = 0;
    }

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

    public String getName() {
        return name;
    }

    public int getHangsome() {
        return hangsome;
    }

    /**
     * 重写toString方法
     */
    @Override
    public String toString() {
        return "姓名:" + this.name + ",帅气指数:" + this.hangsome + "\n";

    }
}

(2)使用带参的new TreeSet(Comparator<? super E> comparator)构造器--提供额外的业务排序类(匿名内部类的方式)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package top.wfaceboss.caseSort;

import java.util.TreeSet;

public class TreeSetDemo01 {
    public static void main(String[] args) {
        Person p1 = new Person("小红", 100);
        Person p2 = new Person("大白", 1000);
        Person p3 = new Person("小明", 10000);
        Person p4 = new Person("小黑", 100000);

        // 依次存放到TreeSet容器中
        // 由于Person类没有实现java.lang.Comparable重写compareTo接口 ,因此需要提供额外的业务排序类,否则会出错

        TreeSet<Person> persons = new TreeSet<Person>(new java.util.Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getHangsome() - o2.getHangsome();
            }
        });

        persons.add(p1);
        persons.add(p2);
        persons.add(p3);
        persons.add(p4);

        System.out.println(persons);
    }
}

 结果为:

 2.TreeMapt:键可以排序且不可重复。

其键的排序方式与上述相同。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-01-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
10.TreeSet、比较器
Comparable和Comparator  Comparable 简介 Comparable 是排序接口。 若一个类实现了Comparable接口,就意味着“该类支持排序”。  即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。 此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或
六月的雨
2018/05/14
1K0
Java集合框架(二)—— HashSet、LinkedHashSet、TreeSet和EnumSet
Set接口   前面已经简绍过Set集合,它类似于一个罐子,一旦把对象'丢进'Set集合,集合里多个对象之间没有明显的顺序。Set集合与Collection基本上完全一样,它没有提供任何额外的方法。   Set集合不容许包含相同的元素,如果试图把两个相同元素加入到同一个Set集合中,则添加操作失败,add方法返回false,且新元素不会被加入。 Set判断两个对象是否相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不会接受这两个对象
10JQKA
2018/05/09
1.2K0
Java集合框架(二)—— HashSet、LinkedHashSet、TreeSet和EnumSet
java 集合框架(TreeSet操作,自动对数据进行排序,重写CompareTo方法)
/*TreeSet * treeSet存入数据后自动调用元素的compareTo(Object obj) 方法,自动对数据进行排序 * 所以输出的数据是经过排序的数据 * 注:compareTo方法返回值有:负数,零,正数。分别表示小于,等于,大于 * 对于存入自定义的对象元素,要重写元素的compareTo(Object obj)方法 * 元素定义时,需要实现Comparable接口 * */
用户3030674
2018/09/14
2.8K0
Set集合
Set集合完整定义 public interface Set extends Collection
兰舟千帆
2022/07/16
5510
Set集合
JavaSE(八)集合之Set
今天这一篇把之前没有搞懂的TreeSet中的比较搞得非常的清楚,也懂得了它的底层实现。希望博友提意见! 一、Set接口 1.1、Set集合概述   Set集合:它类似于一个罐子,程序可以依次把多个对象 “丢进” Set 集合,而 Set 集合通常不能记住元素的添加的顺序,也就是说Set 集合是无序的。         Set 集合与 Colleaction 基本相同,没有提供额外的方法,实际上 Set 就是 Collection,只是行为略有不同(Set 不允许包含重复元素)。 1.2、Set类型集合特点
用户1195962
2018/01/18
9920
JavaSE(八)集合之Set
Set集合
  Set接口也是Collection的子接口,Set接口没有提供额外的方法。Set集合支持的遍历方式也和Collection集合一样,使用foreach和Iterator遍历。
别团等shy哥发育
2023/02/25
6100
Set集合
TreeSet集合解析
 TreeSet是实现Set接口的实现类。所以它存储的值是唯一的,同时也可以对存储的值进行排序,排序用的是二叉树原理。所以要理解这个类,必须先简单理解一下什么是二叉树。
Kevin_Zhang
2019/01/28
7810
TreeSet集合的add()方法的源码解析
用TreeSet存储Integer类型数据并遍历   20,18,23,22,17,24,19,18,24 1 package cn.itcast_05; 2 3 import java.util.TreeSet; 4 5 /* 6 * TreeSet:能够对元素按照某种规则进行排序。 7 * 排序有两种方式(具体那种方式取决于使用TreeSet的构造方法) 8 * A:自然排序 9 * B:比较器排序 10 *
黑泽君
2018/10/12
6260
Java集合分类以及各自特点
常用的就是ArrayList,LinkedList,HashSet,LinkedHashSet,TreeSet,HashMap,LinkedHashMap,TreeMap; 数组和集合的区别 区别1: 数组可以存储基本数据类型/引用数据类型 基本数据类型存的是值 引用数据类型存的是地址 数组在创建的时候 就会定义存储的数据类型 也就是只能存储一种数据类型 集合只能存储引用数据类型(对象) 集合中也可以存储基本数据类型(装箱)最终存储的还是 Object 如果没有泛型限定 默认存储的都是 Object类型的数据 也就是任意类型 区别2 数组长度是固定的,不能自动增长 集合是长度可变的,根据元素的多少来决定长度
全栈程序员站长
2022/09/01
5070
Java基础——Set接口
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/51272846
DannyHoo
2018/09/13
4150
Java基础——Set接口
Java集合(四)--treeset/treemap/章节练习题目/去重原理的解读和应用
下面的这个就是对于这个treeset结构进行测试的一个程序,在这个里面,add表示的就是对于这个树上面进行元素的添加,打印的结果也是无序的;
阑梦清川
2025/02/24
940
Java集合(四)--treeset/treemap/章节练习题目/去重原理的解读和应用
集合实现排序的方式 Comparable & Comparator
当我们添加元素到容器的时候,如果使用的不允许重复的集合例如 TreeSet,在实现Comparable的时候 如果 我们写的条件过少,就会导致compareTo 返回值 = 0,我们的集合就会默认这个元素相同,导致无法添加到集合!
收心
2022/01/19
3820
集合实现排序的方式 Comparable & Comparator
浅谈Comparable与Comparator的区别
平时进行自定义排序一直使用实现Comparable接口,一段时间后操作的时候居然发现有了个Comparator接口
陈灬大灬海
2022/11/28
3290
浅谈Comparable与Comparator的区别
集合框架【第二章】——Set(HashSet与TreeSet)
1. Set   1.1 特点:无序、对象不能重复   1.2 遍历     1.2.1 foreach     1.2.2 迭代器      1.3 常用实现类       HashSet
用户10196776
2022/11/22
2150
集合框架【第二章】——Set(HashSet与TreeSet)
Comparable 和 ComparatorComparable 自然排序
Comparable 自然排序 Comparable 在 java.lang 包下,是一个接口,内部只有一个方法 compareTo(): Comparable 可以让实现它的类的对象进行比
JavaEdge
2018/05/16
7580
【Java入门提高篇】Day31 Java容器类详解(十三)TreeSet详解
  TreeSet是Set家族中的又一名懒将,跟其他两位一样,与对应的Map关系密不可分
弗兰克的猫
2018/09/03
3240
【Java入门提高篇】Day31 Java容器类详解(十三)TreeSet详解
java基础学习_集合类03_用户登录注册案例(集合版)、Set集合、Collection集合总结_day17总结
============================================================================= ============================================================================= 涉及到的知识点有: 1:用户登录注册案例(集合版)(理解) 2:Set集合(理解)   (1)Set集合的特点   (2)HashSet集合(掌握)   (3)TreeSet集合(理解)   (4)案例 3:Collection集合总结(掌握) 4:针对Collection集合我们到底使用谁呢?(掌握) 5:在集合中常见的数据结构(掌握) ============================================================================= ============================================================================= 1:用户登录注册案例(集合版)(理解) ----------------------------------------------------------------------------- 2:Set集合(理解) (1)Set集合的特点     无序:存和取的顺序不一致,无索引,不可以存储重复元素(唯一) --------------------------------------- (2)HashSet集合(掌握)     A:底层的数据结构是哈希表(是一个元素为链表的数组)
黑泽君
2018/10/12
4330
Java学习笔记之集合2
本文涉及Java知识点有Set集合,HashSet,LinkedHashSet,TreeSet,比较器Comparator,泛型,可变参数。
Jetpropelledsnake21
2021/12/20
6870
Java学习笔记之集合2
JDK8中的新特性(Lambda、函数式接口、方法引用、Stream)
<font color=red>Java 8</font> (又称为 JDK 8或JDK1.8) 是 Java 语言开发的一个主要版本。 Java 8 是oracle公司于2014年3月发布,可以看成是自Java 5 以来最具革命性的版本。Java 8为Java语言、编译器、类库、开发工具与JVM带来了大量新特性。
鱼找水需要时间
2023/06/01
8080
JDK8中的新特性(Lambda、函数式接口、方法引用、Stream)
透过源码学习设计模式6—策略模式与Comparator
定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户端。它首先定义不同的算法策略,然后客户端把算法策略作为它的一个参数。使用这种模式的一个不错的例子是Collection.sort()方法了,它使用Comparator对象作为参数。根据Comparator接口不同实现,对象会被不同的方法排序。
java达人
2019/09/24
1.1K0
透过源码学习设计模式6—策略模式与Comparator
相关推荐
10.TreeSet、比较器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验