TreeSet

1.HashSet 在存储东西的时候,先利用hashCode计算出Hash值,之后存到哈希表中,如果哈希表中的这个位置已经存在了元素,再调用equals方法,检验这个新进入的元素是否与之前的元素是同一对象

2.TreeSet 添加元素的需要利用Comparable 或者 Comparator

1.Comparable 接口 方法实现TreeSet添加元素

  Comparable接口的API介绍如下:

比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

实现类必须确保对于所有的 x 和 y 都存在 sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) 的关系。(这意味着如果 y.compareTo(x) 抛出一个异常,则 x.compareTo(y) 也要抛出一个异常。)

实现类还必须确保关系是可传递的:(x.compareTo(y)>0 && y.compareTo(z)>0) 意味着 x.compareTo(z)>0

最后,实现者必须确保 x.compareTo(y)==0 意味着对于所有的 z,都存在 sgn(x.compareTo(z)) == sgn(y.compareTo(z))。 强烈推荐 (x.compareTo(y)==0) == (x.equals(y)) 这种做法,但并不是 严格要求这样做。一般来说,任何实现 Comparable 接口和违背此条件的类都应该清楚地指出这一事实。推荐如此阐述:“注意:此类具有与 equals 不一致的自然排序。”

在前面的描述中,符号 sgn(expression) 指定 signum 数学函数,该函数根据 expression 的值是负数、零还是正数,分别返回 -10 或 1 中的一个值。

可以利用两个对象中的比较值减,就可以得到负数 正数 零   当然也可以利用三目运算;

public class Demo4 {

    /*
     //Comparable 接口
         使用TreeSet注意:
                     1.往TreeSet添加元素的时候如果元素本身具备自然顺序的特性
                     2.往TreeSet添加的元素不具备自然顺序,就需要元素所属的类必须
                         实现Comparable接口,把元素的比较规则定义在compareTo(T o) 方法中
                     3.若compareTo中的方法返回的是0,那么该元素就被视为重复元素,就不会添加到Set中,
                         与hashCode和equals没有任何影响

         Set原理:其实就是一个二叉树
                     1.第一个进入的时候自己和自己比较,下一个元素来的时候,就开始比较,小于其在左边,大于其在右边
                     2.若三个元素构不成一个二叉树,那么自动调整为一个二叉树,取三个元素中间的为根节点,之后再进行比较
                     3.若在添加元素过程中再次出现三个元素构不成一个二叉树,那么就取第一个元素为根节点,形成新的二叉树

     */

    public static void main(String[] args) {
        TreeSet tree = new TreeSet();
        tree.add(new Staff(112, "张浪", 3000));
        tree.add(new Staff(110, "张亮", 1000));
        tree.add(new Staff(111, "李四", 2500));
        tree.add(new Staff(101, "李点", 2500));//不会存到Set中
        System.out.println(tree);
    }

}

class Staff implements Comparable{

    int num ;
    String name;
    int salay;

    public Staff(int num, String name, int salay) {
        this.num = num;
        this.name = name;
        this.salay = salay;
    }

    @Override
    public int compareTo(Object o) {
        Staff s = (Staff) o;
        /*
        return salay > s.salay ?1:salay < s.salay?-1:0;
        */
        return this.salay - s.salay; //小到大

      //return s.salay - this.salay; //大到小
    }

    @Override
    public int hashCode() {
        return num;
    }

    @Override
    public boolean equals(Object obj) {
        Staff s = (Staff) obj;
        return (name == s.name) && (salay == s.salay);
    }

    @Override
    public String toString() {

        return "{"+num+name+" "+salay+"}";
    }

}

2.Comparator 实现TreeSet容器添加元素

时间: 2024-11-23 09:24:04

TreeSet的相关文章

java HashSet 与 TreeSet

Set接口并没有对Collection接口进行扩充,只是比Collection接口要求更加严格了,不能增加重复的元素,并且采用散列的储存方式,所以没有顺序 import java.util.Set; import java.util.HashSet; import java.util.TreeSet; public class Test { public static void main(String[] args) { //Set allSet = new HashSet();//@结果 1

HashSet,TreeSet和LinkedHashSet的区别

Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用equals方法比较返回true,Set就不 会接受这两个对象. HashSet: 顺序是不确定性的. LinkedHashSet:按照输入的顺序进行输出. TreeSet:SortedSet 接口的唯一实现类,保证集合元素处于排序状态. 1.HashSetHashSet有以下特点    不能保证元素的

排序及重复元素去重的说明,TreeSet,HashSet

先看下面一段代码: package 类集; import java.util.Set; import java.util.TreeSet; class Person{ private String name ; private int age ; public Person(String name,int age){ this.name = name ; this.age = age ; } public String gtoString(){ return "姓名:" + this.

Java集合框架总结(3)——TreeSet类的排序问题

Java集合框架总结(3)--TreeSet类的排序问题 TreeSet支持两种排序方法:自然排序和定制排序.TreeSet默认采用自然排序. 1.自然排序 TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方式就是自然排序.(比较的前提:两个对象的类型相同). java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现该接口的类必须实现该

Treeset集合

TreeSet 集合的特点: 1.它是Set集合的一种 就是无角标型的,二分叉的数据结构 2.它是按照CompareTo()来有序地存放数据的 3.它可以依赖2中比较方式,一种是比较器,一种Comperable; 4.比较器可以随便定义主要比较方法,而Comperable是要格局特定的需求更改的 ------------------------------------------------------------------------------------------- package c

HashSet vs. TreeSet vs. LinkedHashSet

A Set contains no duplicate elements. That is one of the major reasons to use a set. There are 3 commonly used implementations of Set: HashSet, TreeSet and LinkedHashSet. When and which to use is an important question. In brief, if you need a fast se

TreeSet的学习

TreeSet is another popular implementation of Set interface along with HashSet and LinkedHashSet. All these implementations of Set interface are required in different scenarios. If you don’t want any order of elements, then you can use HashSet. If you

Java 集合类 TreeSet、TreeMap

TreeMap和TreeSet的异同: 相同点: TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是拍好序的. TreeMap和TreeSet都是非同步集合,因此他们不能在多线程之间共享,不过可以使用方法Collections.synchroinzedMap()来实现同步 运行速度都要比Hash集合慢,他们内部对元素的操作时间复杂度为O(logN),而HashMap/HashSet则为O(1). 不同点: 最主要的区别就是TreeSet和TreeMap非别实现Set和Map接

Java API —— TreeSet类

1.TreeSet类  1)TreeSet类概述 使用元素的自然顺序对元素进行排序 或者根据创建 set 时提供的 Comparator 进行排序 具体取决于使用的构造方法.   2)TreeSet是如何保证元素的排序和唯一性的 底层数据结构是红黑树(红黑树是一种自平衡的二叉树) 例子1: package treesetdemos; import java.util.TreeSet; /** * Created by gao on 15-12-17. */ /* * TreeSet:能够对元素按