一、TreeSet中的元素比较有两种方式

1、定义一个类,实现Comparable接口  复写的是comparato方法

2、定义一个类,实现Comparator接口,覆盖compara方法(此种方法是当集合内元素不具备比较或者所具有的比较不是想要的时候,另建立类来实现comparato接口,通过重写compara方法来编写自己想要的排序方式)

当两种排序都存在时,以比较器为主。

二叉树都是以 return 0,ba判断两个元素相等。

代码示例:

/*TreeSet底层数据结构:
 *
 *
 *
 *
 *
 *
 *
 *
 *
 * */

package 集合;

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

public class TreeSetTest {
    public static void main(String[] args) {
        TreeSet  ts = new TreeSet(new MyCompar());//第二种方法传入的比较器

//如下是用匿名内部类的方式传入比较器

ts.add(new Person3("lisan01",18));
        ts.add(new Person3("lisan02",19));
        ts.add(new Person3("lisan03",13));
        ts.add(new Person3("lisan01",20));
        ts.add(new Person3("lisan02",20));
        ts.add(new Person3("lisan01",20));
        
        //要求:按照年龄从小到达排序
        Iterator it = ts.iterator();
        while(it.hasNext()){
            Person3 ps = (Person3)it.next();
            System.out.println(ps.getName()+"::"+ps.getAge());
        }
        
    }
}

//定义一个类,实现Comparable接口  复写的是comparato方法
class Person3 implements Comparable{//该接口强制让学生具备比较性
    private String name;
    private int age;
    
    public Person3() {
        // TODO 自动生成的构造函数存根
    }
    public Person3(String name,int age){
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    public int compareTo(Object obj) {
        
        if(!(obj instanceof Person3)){
            throw new RuntimeException("不是人的对象");
        }else{
            Person3 ps = (Person3)obj;
            if(this.age>ps.age){
                return 1;
            }else if(this.age==ps.age){
                return this.name.compareTo(ps.name);
            }else{
                return -1;
            }
        }
    }

//第二种方式:定义一个类,实现Comparator接口,覆盖compara方法

class MyCompar implements Comparator{
    //要求要按名字来排序
    public int compare(Object obj1, Object obj2) {
        Person3 p1 = (Person3)obj1;
        Person3 p2 = (Person3)obj2;
        int num = p1.getName().compareTo(p2.getName());
        if(num == 0){
            /*if(p1.getAge()>p2.getAge())
                return 1;
            if(p1.getAge() == p2.getAge())
                return 0;
            if(p2.getAge()<p2.getAge())
                return -1;*/
            //用整数的包装类来实现comparato
            return new Integer(p1.getAge()).compareTo(new Integer(p2.getAge()));
                
        }
        return num;
    }
    
}

}

TreeSet的更多相关文章

  1. HashSet HashTable 与 TreeSet

    HashSet<T>类 HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集.并集.差集等.集合中包含一组不重复出现且无特性顺序的元素. HashSet& ...

  2. 计算机程序的思维逻辑 (44) - 剖析TreeSet

    41节介绍了HashSet,我们提到,HashSet有一个重要局限,元素之间没有特定的顺序,我们还提到,Set接口还有另一个重要的实现类TreeSet,它是有序的,与HashSet和HashMap的关 ...

  3. HashSet,TreeSet和LinkedHashSet的区别

    Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...

  4. 集合 LinkedList、ArrayList、Set、Treeset

    LinkedList中特有的方法: 1:方法介绍 addFirst(E e) addLast(E e) getFirst() getLast() removeFirst() removeLast() ...

  5. HashSet和TreeSet

    package com.wzy.list; import java.util.HashSet; import java.util.Iterator; import java.util.Set; imp ...

  6. Java 集合类 TreeSet、TreeMap

    TreeMap和TreeSet的异同: 相同点: TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是拍好序的. TreeMap和TreeSet都是非同步集合,因此他们不能在多线程之 ...

  7. JAVA中的TreeSet

    TreeSet简介 TreeSet是一个有序的集合,它的作用是提供一个有序的Set集合,它继承于AbstractSet抽象类实现了NavigableSet<E>, Cloneable, j ...

  8. Leetcode: LFU Cache && Summary of various Sets: HashSet, TreeSet, LinkedHashSet

    Design and implement a data structure for Least Frequently Used (LFU) cache. It should support the f ...

  9. 【皇甫】☀ TreeSet

    -Set: 元素是无序(存入和取出的顺序不一致),元素不可以重复 |-- HashSet: 底层数据结构是哈希表 HashSet是如何保证元素的唯一性的呢? 是通过元素的两个方法,hashCode和e ...

随机推荐

  1. vs2013在使用ReportView11时遇到的问题

    最近在做项目中用到2013中的ReportView11  在本机IIS中使用完全没问题  但是放到服务器上总是出问题 解决办法:(1)首先在自己机器上开发的时候  是不用引用  Microsoft.R ...

  2. 不得不喷一下中控科技,ZKT,恶心的中控,售后技术和屎一样,半年不见人。

    要做一个指纹考勤机和后台通信写入到mysql.在淘宝看了好多款,于是决定用指纹考勤机w6.卖家当时说支持二次开发,给我发的sdk.于是买了一台测试.机器来了开始测试,使用发的demo不能使用,于是去中 ...

  3. libsvm下的windows版本中的工具的使用

    下载的libsvm包里面已经为我们编译好了(windows).进入libsvm\windows,可以看到这几个exe文件: a.svm-toy.exe:图形界面,可以自己画点,产生数据等. b.svm ...

  4. WPF 如何画一颗心

    如何用WPF画一个心. MainWindow.xaml <Window x:Class="Heart.MainWindow" xmlns="http://schem ...

  5. Swift - 点击事件奇偶次判断

    // 按钮点击事件 func onTouchUpInside() { struct touchUpInside { static var count: Int = 0 } touchUpInside. ...

  6. php单点登录之模拟淘宝天猫同步登录

    说到单点登录大家都很了解,一个站点登录其他域会自动登录. 单点登录SSO(Single Sign On)的方法有很多,比如:p3p.共享session.共享cookice.第三方OAuth认证. 这里 ...

  7. HTML5教程之html 5 本地数据库(Web Sql Database)

    HTML5的Web SQL Databases(html5 本地数据库)的确很诱惑人,当你发现可以用与mysql查询一样的查询语句来操作本地数据库时,你会发现这东西挺有趣的.今天,我们一起来了解HTM ...

  8. 闪回查询(SELECT AS OF)

    使用Flashback Query的场景包括如下: 摘自官档 Recovering lost data or undoing incorrect, committed changes. For exa ...

  9. spring configuration 注解

    org.springframework.context.annotation @annotation.Target({ElementType.TYPE}) @annotation.Retention( ...

  10. C++产生随机数

    随机数 计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子.(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是6 ...