一、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. ubuntu 加载新硬盘或分区

    查看目前挂载情况 df -lh 查看新的空间或硬盘 fdisk -lu 新硬盘分区 fdisk /dev/sda 输入m 根据提示输入n(创建一个分区) 然后输入e(扩展分区) 输入分区数1 然后指定 ...

  2. Python初学者应了解的技巧

    交换变量 x = 6 y = 5 x, y = y, x print x >>> 5 print y >>> 6 if 语句在行内 print "Hell ...

  3. 解决Eclipse Failed to write core dump. Minidumps are not enabled by default on client versions

    -XX:+CreateMinidumpOnCrash 如果还有问题,就只能看日志了 T_T

  4. Idea 快捷键

    Ctrl+Alt+T 选中代码块加try catch等常用快捷操作.如图: psvm+Tab键 快速创建main方法 pout+Tab键 快速打出System.out.println(); Ctrl+ ...

  5. 怎么理解js中的事件委托

    怎么理解js中的事件委托 时间 2015-01-15 00:59:59  SegmentFault 原文  http://segmentfault.com/blog/sunchengli/119000 ...

  6. 忘记mysq rootl密码

    忘记mysq rootl密码 1       mysql忘记root密码 1.1     查看mysql的进程 [root@mysql data]# cat /data/mysql.localdoma ...

  7. 关于StringBuffer和StringBuilder

    StringBuffer 字符串特点:字符串是常量:它们的值在创建之后不能更改. 字符串的内容一旦发生了变化,那么马上会创建一个新 的对象. 注意: 字符串的内容不适宜频繁修改,因为一旦修改马上就会创 ...

  8. user agent stylesheet (浏览器默认样式)!

    "-webkit-margin-before". "-webkit-margin-after". "-webkit-margin-start" ...

  9. Windows平台下和跨平台的相关公共库

    以下主要包含windows下公共库以及跨平台公共库: 1. google base库:google下chromium项目的跨平台公共库: 2. vc_common_src:即HP_SOCKET项目中的 ...

  10. 【leetcode】Largest Number

    题目简述: Given a list of non negative integers, arrange them such that they form the largest number. Fo ...