TreeSet 比较器排序 自定义对象

package cn.itcast.day21.treeset2;

import java.util.Comparator;
import java.util.TreeSet;

/*
 * TreeSet 按照自定义对象Student的姓名长度 比较器排序
 *
 * 自然排序or比较器排序取决于,TreeSet的构造方法
 *     无参构造:自然排序
 *     有参构造: 比较器排序
 *
 * TreeSet集合保证元素排序和唯一性的原理
 * 唯一性:根据比较的返回是否是0来决定
 * 排序:
 *         A:自然排序(元素具备比较性)
 *             让元素所属的类实现自然排序接口Comparable
 *         B:比较器排序(集合具备比较性)
 *             让集合的构造方法接收一个比较器接口的子类对象Comparator
 *
 */
public class TreeSetDemo {
    public static void main(String[] args) {
        //创建集合对象
//        TreeSet<Student> ts=new TreeSet<Student>();//自然排序
//        TreeSet<Student> ts= TreeSet(Comparator comparator);//比较器排序 ---推荐使用!因为匿名内部类对其他代码的影响较小
        TreeSet<Student> ts=new TreeSet<Student>(new Comparator<Student>(){

            @Override
            public int compare(Student o1, Student o2) {
                int num=o1.getName().length()-o2.getName().length();
                int num2=num==0?o1.getName().compareTo(o2.getName()):num;
                int num3=num2==0?o1.getAge()-o2.getAge():num2;
                return num3;
            }
        });
        //创建元素对象
        Student s1=new Student("linqingxia",27);
        Student s2=new Student("wuqilong",27);
        Student s3=new Student("wanglihong",34);
        Student s4=new Student("zhouxingchi",57);
        Student s5=new Student("linqingxia",28);
        Student s6=new Student("linqingxia",27);

        //添加集合元素
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        ts.add(s6);

        //遍历集合
        for(Student s:ts){
            System.out.println(s.getName()+"-----"+s.getAge());
        }
    }

}

package cn.itcast.day21.treeset2;

public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public Student() {
        super();
    }
    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;
    }

}

 

 

自然排序和比较器排序哪个更好呢?

     建议:   如果只使用一次,建议采用匿名内部类的方式实现比较器排序。(针对集合的构造)

                    这样做的好处:当Student类发生变化时,不用修改整体比较逻辑,即不用修改自然排序依赖的compareTo()方法(元素具备的比较性)

时间: 2024-10-07 18:52:06

TreeSet 比较器排序 自定义对象的相关文章

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

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

通过定义__lt__,直接sorted排序自定义对象。

class Demo: def __init__(self, x, y, z): self.x = x self.y = y self.z = z @property def all_sum(self): # 方法转属性 return self.x + self.y +self.z def __lt__(self, other): # 对比 return self.all_sum < other.all_sum def __repr__(self): ... d1 = Demo(4, 2, 3,

TreeSet排序,存储自定义对象,自定义比较器示例

Set:无序,不可以重复元素. |--HashSet:数据结构是哈希表.线程是非同步的. 保证元素唯一性的原理:判断元素的hashCode值是否相同. 如果相同,还会继续判断元素的equals方法,是否为true. |--TreeSet:可以对Set集合中的元素进行排序. 底层数据结构是二叉树. 保证元素唯一性的依据:compareTo方法return 0. TreeSet排序的第一种方式:让元素自身具备比较性. 元素需要实现Comparable接口,覆盖compareTo方法. 也种方式也成为

Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序)

1. TreeSet存储自定义对象并遍历练习1(自然排序): (1)Student.java: 1 package cn.itcast_05; 2 3 /* 4 * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 5 */ 6 public class Student implements Comparable<Student> { 7 private String name; 8 private int age; 9 10 public Student() { 11 super

Java基础知识强化之集合框架笔记46:Set集合之TreeSet存储自定义对象并遍历练习2(自然排序)

1. TreeSet存储自定义对象并遍历练习2: (1)Student.java 1 package cn.itcast_06; 2 3 /* 4 * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 5 */ 6 public class Student implements Comparable<Student> { 7 private String name; 8 private int age; 9 10 public Student() { 11 super(); 12

《java入门第一季》之TreeSet存储自定义对象并保证排序和唯一

上一篇用一个简单的例子,介绍了treeset集合存储的内部过程,这里再完善其存储自定义对象保证唯一. 需求:A: * 自然排序,按照年龄从小到大排序 *         B: * 成员变量值都相同即为同一个元素 自定义学生类给了出来: public class Student implements Comparable<Student> { private String name; private int age; public Student() { super(); } public St

Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序)

1. TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序) (1)Student.java: 1 package cn.itcast_07; 2 3 public class Student { 4 private String name; 5 private int age; 6 7 public Student() { 8 super(); 9 } 10 11 public Student(String name, int age) { 12 super(); 13 thi

NSArary自定义对象排序 NSComparator, compare

reference from :http://mobile.51cto.com/hot-434804.htm 1.构建Person类 Person.h @interface Person : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, copy) NSString *surname; @property (nonatomic, strong) NSDate *dateOfBirth; @en

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

前言:TreeSet集合是Set集合的一个子实现类,它是基于TreeMap中的NavigableSet接口实现的,TreeSet集合是默认通过自然排序将集合中的元素进行排序 TreeSet有两种排序方式: 1)自然排序 2)比较器排序 1. 自然排序: 在TreeSet中默认要求里面的元素进行自然排序,强制要求里面的所有元素必须按照Comparable中的compareTo方法进行比较. 如果容器里面的对象不具备compareTo方法此时就会抛出异常报错,所以必须要让容器中的元素实现Compar