一、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. .NetChajian

    Code generation(代码自动生成) NVelocity CodeSmith X-Code .NET XGoF - NMatrix / DEVerest Compilation(编译工具) ...

  2. Storyboard & XIB 自己的理解

    //1.storyboard //(1) //此处bundle:nil 等价于 [NSBundle mainBundle] //    SecondViewController *secondVc = ...

  3. Python 小爬虫流程总结

    接触Python3一个月了,在此分享一下知识点,也算是温故而知新了. 接触python之前是做前端的.一直希望接触面能深一点.因工作需求开始学python,几乎做的都是爬虫..第一个demo就是爬取X ...

  4. 使用getParts()上传多个文件

    <!DOCTYPE html> <html> <head> <title></title> <meta http-equiv=&quo ...

  5. [转]VS2012 快捷键

    Ctrl+E,D ----格式化全部代码       Ctrl+A+K+F Ctrl+E,F ----格式化选中的代码     Ctrl+K+F CTRL + SHIFT + B生成解决方案   Al ...

  6. java.io.Serializable 序列化接口

    什么是序列化.反序列化? Serialization(序列化)是一种将对象以一连串的字节描述的过程: 反序列化deserialization是一种将这些字节重建成一个对象的过程. 序列化通俗一点说就是 ...

  7. vmware下centos7桥接模式无法上网

    前一段时间由于想给vm中的centos分配一个独立的IP,就将网络适配器的连接方式由NAT改为桥接,一切顺利. 今天再次开机,IP居然变成了192开头的局域网,并且ping不通外网,经过查找资料,解决 ...

  8. 获取QQ缓存图片

  9. Lintcode 97.二叉树的最大深度

    --------------------------------- AC代码: /** * Definition of TreeNode: * public class TreeNode { * pu ...

  10. MapReduce工作原理图文详解

    目录:1.MapReduce作业运行流程2.Map.Reduce任务中Shuffle和排序的过程 1.MapReduce作业运行流程 流程示意图: 流程分析: 1.在客户端启动一个作业. 2.向Job ...