一、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. Swing中弹出对话框的几种方式_JOptionPane.showMessageDialog等详解

    Swing中弹出对话框的几种方式_JOptionPane.showMessageDialog等详解   在swing中,基于业务的考量,会有对话框来限制用户的行为及对用户的动作进行提示. Swing中 ...

  2. CentOS 安装Paramiko模块

    转自:http://www.cnblogs.com/hyli/p/3910585.html 1.下载安装包: https://pypi.python.org/packages/source/p/par ...

  3. SqlServer 2008登录时报错

    登录SQLServer2008R2时提示如下错误: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server ...

  4. 浅谈display:flex

    display:flex 意思是弹性布局 首先flex的出现是为了解决哪些问题呢? 一.页面行排列布局 像此图左右两个div一排显示 可以用浮动的布局方式 html部分 css部分 这种布局有两个缺点 ...

  5. 正则-RegExp()构造函数

    上次写了js正则的字面量声明,今天说说RegExp()构造函数声明: var p=/cat/g;   //字面量声明var p=new RegExp('cat','g') //构造函数声明 它两所表达 ...

  6. 51nod1240(莫比乌斯函数)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1240 题意:中文题诶- 思路:直接暴力筛选就好了... 代码 ...

  7. AngularJS 动画

    AngularJS 提供了动画效果,可以配合 CSS 使用. AngularJS 使用动画需要引入 angular-animate.min.js 库. <script src="htt ...

  8. centos7下操作防火墙

    引言 最近使用centos7系统比较频繁,在配置服务器的时候,总是遇到能够ping通服务器,但是就是没有办法访问80端口,这个时候我的直觉告诉我,肯定是防火墙的原因,但是使用iptables却怎么都找 ...

  9. 获取json数据

    通过异步获取json来展示数据表格,性能提高不少.实例如下: 前台: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999 ...

  10. Android-Spinner [使用C# And Java实现]

    效果如下: C#实现代码 using Android.App; using Android.OS; using Android.Widget; namespace SpinnerDemo { [Act ...