TreeSet——实现Comparable接口并重写CompareTo()方法

TreeSet是以自然顺序存的数据,例如

Set<Student> students=new TreeSet();
        students.add(new Student("111"));
        students.add(new Student("333"));
        students.add(new Student("222"));

        for (Student student : students) {
            System.out.println(student.getId());
        }

输出结果为111  222  333

而且这时候的Student必须继承Comparable接口,重写抽象方法CompareTo方法

public class Student implements Comparable<Student> {

    private String id;

    public Student(String id) {
        this.id = id;
    }

    @Override
    public int compareTo(Student o) {
        return 1;
    }

}

出现这样的效果是因为存储的时候的代码是这样的

public V put(K key, V value) {
        Entry<K,V> t = root;
        if (t == null) {
            compare(key, key); // type (and possibly null) check

            root = new Entry<>(key, value, null);
            size = 1;
            modCount++;
            return null;
        }
        int cmp;
        Entry<K,V> parent;
        // split comparator and comparable paths
        Comparator<? super K> cpr = comparator;
        if (cpr != null) {
            do {
                parent = t;
                cmp = cpr.compare(key, t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        else {
            if (key == null)
                throw new NullPointerException();
            @SuppressWarnings("unchecked")
                Comparable<? super K> k = (Comparable<? super K>) key;
            do {
                parent = t;
                cmp = k.compareTo(t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }
        Entry<K,V> e = new Entry<>(key, value, parent);
        if (cmp < 0)
            parent.left = e;
        else
            parent.right = e;
        fixAfterInsertion(e);
        size++;
        modCount++;
        return null;
    }

看红色的代码,存储的时候执行compareTo方法,这个时候就会判断你存的值得大小顺序,然后判断你该存储的顺序,就是自然顺序了。。

原文地址:https://www.cnblogs.com/lyxcode/p/9467257.html

时间: 2024-11-05 16:07:43

TreeSet——实现Comparable接口并重写CompareTo()方法的相关文章

TreeSet的自然排序(自定义对象 compareTo方法)

>要实现自然排序,对象集合必须实现Comparable接口,并重写compareTo()方法 >一般需求中描述的是"主要条件",如:按姓名长度排序.  需注意次要条件 如:长度相同时,姓名内容,年龄等条件是否相等,这决定着是否存入TreeSet集合.   package cn.itcast.day21.treeset; /* * 要实现自然排序,就一定要实现Comparable接口,并重写compareTo()方法 * * 若不实现Comparable接口,而把对象往Tre

java 集合框架(TreeSet操作,自动对数据进行排序,重写CompareTo方法)

/*TreeSet * treeSet存入数据后自动调用元素的compareTo(Object obj) 方法,自动对数据进行排序 * 所以输出的数据是经过排序的数据 * 注:compareTo方法返回值有:负数,零,正数.分别表示小于,等于,大于 * 对于存入自定义的对象元素,要重写元素的compareTo(Object obj)方法 * 元素定义时,需要实现Comparable接口 * */ 1 import java.util.Iterator; 2 import java.util.Tr

8.13.2 TreeSet实现Comparable接口的两种方式

推荐使用第二种方式,编写比较器可以使数据类的程序耦合度降低,同时比较器也可以重复利用! 第一种方式:数据类实现Comparable接口,实现其中的compareTo方法 创建对象时,使用TreeSet的默认构造函数! SortedSet users = new TreeSet(); class User implements Comparable{ //String name; int age; User(int age){ this.age = age; } public String toS

String类中自动重写compareTo( )方法对汉字的比较

在看Java从入门到精通的过程中遇到这样一道习题:定义Student类,该类不实现Comparable接口,定义一个Comparator类比较两个Student对象所在班级名称和名字,班级名相同时用名字进行排序,使用TreeSet观察排序结果. 这是我最初写的程序和运行结果截图 package javautil; import java.util.Iterator; import java.util.TreeSet; import java.util.Comparator; class MyCo

Comparable接口实现和使用方法介绍

1.什么是Comparable接口 此接口强行对实现它的每个类的对象进行整体排序.此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 .实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序.实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器. 强烈推荐(虽然不是必需的)使自然排序与 equals 一致.所谓与equals一致是指对于类 C 的每一个 e1 和 e2 来说,当且

Comparable接口的compareTo()方法

[代码] 1 package com.hxl; 2 3 public class Student implements Comparable<Student> { 4 5 private String name; 6 private int age; 7 8 public Student() { 9 super(); 10 } 11 12 public Student(String name, int age) { 13 super(); 14 this.name = name; 15 thi

javabean对象要实现的接口们和要重写的方法们

在使用list集合的时候,什么也不用. 原因:list允许存储重复的元素. 在使用set集合的时候,要重写,equals()方法 和 hashCode() 方法. 愿意:set集合 不允许存放相同的元素,而默认比较的是两个 对象地址的值,这样,两个对象恒不等.所以 我们需要重写equals()方法,当再次存入的时候用以判定两个对象到底是不是相等.如果两个对象相等了,那么两个 对象必然应该用有相同的hash值,所以在重写equals() 方法的同时,也要重写hashCode()方法. 如果要使用C

正确重写equals方法和compareTo方法

一.概述 程序要对一堆数据元素排序,查找,增加删除.数据节点 class Node{ int type; int index; int score; } 规则: 1)对象相等:两个节点n1与n2,如果n1.type == n2.type && n1.index == n2.index则n1等于n2 2)排序:升序,比较score,score相同则比较type,type相同则比较index.最开始我使用TreeMap存储.实现Comparable接口,重写equals方法与hashCode方

【原创】关于java对象需要重写equals方法,hashcode方法,toString方法 ,compareto()方法的说明

在项目开发中,我们都有这样的经历,就是在新增表时,会相应的增加java类,在java类中都存在常见的几个方法,包括:equals(),hashcode(),toString() ,compareto()这四个方法,对于刚刚接触java的初学者来说,对于这块可以没有更深入的了解,只是单纯意义上的复制粘贴,并没有很好的去了解.现在借用这个时间给大家说说这几个方法作用. equals: 比较两个对象相等时使用(需要配合Hashcode一起使用,在后边再进行详细解释)   hashcode: 重写has