TreeSet ------自然排序与定制排序(比较器)

前言:TreeSet集合是Set集合的一个子实现类,它是基于TreeMap中的NavigableSet接口实现的,TreeSet集合是默认通过自然排序将集合中的元素进行排序

  TreeSet有两种排序方式:

  1)自然排序

  2)比较器排序

1. 自然排序:

  在TreeSet中默认要求里面的元素进行自然排序,强制要求里面的所有元素必须按照Comparable中的compareTo方法进行比较。

  如果容器里面的对象不具备compareTo方法此时就会抛出异常报错,所以必须要让容器中的元素实现Comparable接口,这样它才具备compareTo方法。

    1.TreeSet实例在调用add方法时会调用容器对象的compareTo方法对元素进行比较

    2.TreeSet实例中对象必须是实现了Comparable接口

例如:比较Student学生类,应该从哪些方法进行比较?

一般从字段的方面进行比较;比如按照年龄比较;当年龄相等返回0,大于返回1,小于返回-1

姓名是字符串,怎样比较大小,查看api的时候,String已经实现了Comparable接口,String 类里面已经肯定覆写Comparable方法,那是按照String的规则进行比较。

可以直接不管具体内 部是怎样比较,直接调用String类里面比较方法就可以.

package TreeSet;

public class Student implements Comparable {
    private int age;
    private String name;
    public Student(){}
    public Student(int age,String name){
        this.age = age;
        this.name = name;
    }

    @Override
    public int compareTo(Object obj) {
//比如按照年龄比较;当年龄相等返回0,大于返回1,小于返回-1
        Student stu = (Student)obj;
        if(this.age > stu.age){
            return 1;
        }else if(this.age<stu.age){
            return -1;
        }else{
            return this.name.compareTo(stu.name);
        }
    }  

    @Override
    public String toString() {
        return "<" + age + ", " + name + ">";
    }  

}
public class TestStudent {
    public static void main(String[] args) {

        TreeSet set = new TreeSet();
        set.add(new Student(20, "zs"));
        set.add(new Student(21, "zs"));
        set.add(new Student(22, "ww"));
        set.add(new Student(23, "zl"));
        System.out.println(set);
    }
}
//结果:[<20, zs>, <21, zs>, <22, ww>, <23, zl>]

原文地址:https://www.cnblogs.com/gshao/p/10129139.html

时间: 2024-10-01 02:54:50

TreeSet ------自然排序与定制排序(比较器)的相关文章

集合TreeSet(自然排序与定制排序)

一.TreeSet的自然排序: 步骤:让元素自身具备比较性, 实现Compareable接口,覆盖其CompareTo方法 class Student implements Comparable//第一:实现Compareable接口 { private String name; private int age; Student(String name,int age) { this.name = name; this.age = age; } public int compareTo(Obje

java TreeSet的排序之定制排序

TreeSet的自然排序是根据元素的大小进行升序排序的,若想自己定制排序,比如降序排序,就可以使用Comparator接口了: 该接口包含int compare(Object o1,Object o2)方法,用于比较两个对象的大小,比较结果和compareTo方法一致; 要实现定制排序,需要在创建TreeSet集合对象时,提供一个一个Comparator对象,该对象里负责集合元素的排序逻辑; TreeSet(Comparator comparator) Eg: package july7; //

TreeSet之定制排序和自然排序

TreeSet的几大特点: 1.TreeSet中存储的类型必须是一致的,不能一下存int,一下又存string 2.TreeSet在遍历集合元素时,是有顺序的[从小到大](我的理解,如果存的字母,按字典序排列) 3.排序:当向TreeSet中添加自定义对象时,有2种排序方法,1:自然排序 2.定制排序 自然排序:要求自定义类实现java.lang.Comparable接口并重写compareTo(Object obj)方法.在此方法中,指明按照自定义类的哪个属性进行排序 一.自然排序示例: 1.

Java TreeSet的定制排序

注:只贴出实现类 package Test3; import java.util.Comparator;import java.util.TreeSet; public class Test { public static void main(String[] args) { Comparator com=new Comparator() {①创建一个Comparator接口的匿名内部类 @Override public int compare(Object o1, Object o2) {②重

TreeSet的定制排序

1 compare()与hashcode()与equals()三者保持一致 @Test //定制排序 public void testTreeSet2(){ //1.创建一个实现Comparator接口的匿名类对象 Comparator com = new Comparator(){ //向TreeSet中添加Student类的对象,在此compare方法中,指明是按照Customer的哪个属性排序的 public int compare(Object o1,Object o2){ if(o1

List的定制排序 包括使用lambda表达式来实现的方法

1.先实现Comparator的接口 重写compare方法 根据比较大小来返回数值: 比如:(Integer o1  -   Integer o2); return 1 表示o1>o2; return -1 表示o1<o2; return 0 表示 o1 = o2; 因此可以根据这个返回值来设定TreeSet里面的元素升序或者降序排列 ,下面演示的是实现接口并重写的方式来定制排序: @Override public int compare(Object o1, Object o2) { if

Hadoop---mapreduce排序和二次排序以及全排序

自己学习排序和二次排序的知识整理如下. 1.Hadoop的序列化格式介绍:Writable 2.Hadoop的key排序逻辑 3.全排序 4.如何自定义自己的Writable类型 5.如何实现二次排序 1.Hadoop的序列化格式介绍:Writable 要了解和编写MR实现排序必须要知道的第一个知识点就是Writable相关的接口和类,这些是HADOOP自己的序列化格式.更多的可能是要关注他的Subinterfaces:WritableComparable<T>.他是继承Writable和Co

java-数组排序--计数排序、桶排序、基数排序

计数排序引入 不难发现不论是冒泡排序还是插入排序,其排序方法都是通过对每一个数进行两两比较进行排序的,这种方法称为比较排序,实际上对每个数的两两比较严重影响了其效率,理论上比较排序时间复杂度的最低下限为nlog(n),即任何比较排序的时间复杂度将不会低于nlog(n),那么有没有方法能不经过数列比较就能使数列排序呢 ,她们的时间复杂度又是多少呢??? 计数排序就是一个非比较排序的算法,一如鱼与熊掌不可兼得,她使用了牺牲空间换时间的方法,使的时间复杂度可以达到Ο(n+k) 假设我们有一个数列arr

排序算法——希尔排序

希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 该方法因DL.Shell于1959年提出而得名. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多, 当增量减至1时,整个文件恰被分成一组,算法便终止. 代码实现 void shellsort(int a[],int n) { int gap=0,i=0,temp=0,j=0; for(