个性集合之TreeSet类的元素有序性排序和元素唯一性的特点
2017-03-25 22:59
393 查看
TreeSet类是一个具体的类,实现了Set接口,同时Set接口实现Collection接口,三者均带有泛型标志,TreeSet类能够对元素进行有序排序和保证元素不重复存入集合,主要有两条路可以走。
第一,自然排序法,仅仅使用TreeSet的无参构造方法,同时在元素类中实现Comparable<E>接口,同时,复写该接口的CompareTo(T t)方法。那么,具体的排序规则,我们将可以在该复写方法中自行定义,注意,该方法int compareTo(T t)带有返回值类型。方法的说明如下:比较此对象与指定对象的顺序。如果该对象小于、等或大于指定对象,则分别返回负整数、零或正整数。
第二条路,使用带参数构造器,可以说这是集合自带比较器的方法,即TreeSet<E> ts=new TreeSet<E>(Comparator comparator);其中参数(Comparator comparator)是接口类型的参数,形式参数是一个接口类型或者类类型,说明,这里需要的是一个具体实现类对象,所以,这里可以采取匿名对象的形式,并复写接口Comparator的compare(T t1,T t2)方法。那么在该方法体中我们就可以详细写出排序规则。使用匿名对象用完既是垃圾,不占内存。
两种方法比较,第一种方法比较冗余,不方便,第二种,使用匿名对象,同时复写方法,任何排序规则改动只需在这个地方改即可,比较方便。第一种方法(自然排序法),排序规则的改动需要到元素类中去改动,该排序规则相对于第二种走的路,第一种走的路较多。所以,推荐使用第二种方法。第一种方法,元素类实现相应接口,复写相应方法,方法内定义规则,说白了,就是元素本身具备比较器。第二种方法,说白了,就是集合本身自带比较器。
TreeSet类的数据结构是红黑二叉树,所以,它能够保证元素的排序和保证元素的不重复,即唯一性。下面给出两种方法的相应代码比较。
第一种方法,采用自然排序:
第二中,比较器:
第一,自然排序法,仅仅使用TreeSet的无参构造方法,同时在元素类中实现Comparable<E>接口,同时,复写该接口的CompareTo(T t)方法。那么,具体的排序规则,我们将可以在该复写方法中自行定义,注意,该方法int compareTo(T t)带有返回值类型。方法的说明如下:比较此对象与指定对象的顺序。如果该对象小于、等或大于指定对象,则分别返回负整数、零或正整数。
第二条路,使用带参数构造器,可以说这是集合自带比较器的方法,即TreeSet<E> ts=new TreeSet<E>(Comparator comparator);其中参数(Comparator comparator)是接口类型的参数,形式参数是一个接口类型或者类类型,说明,这里需要的是一个具体实现类对象,所以,这里可以采取匿名对象的形式,并复写接口Comparator的compare(T t1,T t2)方法。那么在该方法体中我们就可以详细写出排序规则。使用匿名对象用完既是垃圾,不占内存。
两种方法比较,第一种方法比较冗余,不方便,第二种,使用匿名对象,同时复写方法,任何排序规则改动只需在这个地方改即可,比较方便。第一种方法(自然排序法),排序规则的改动需要到元素类中去改动,该排序规则相对于第二种走的路,第一种走的路较多。所以,推荐使用第二种方法。第一种方法,元素类实现相应接口,复写相应方法,方法内定义规则,说白了,就是元素本身具备比较器。第二种方法,说白了,就是集合本身自带比较器。
TreeSet类的数据结构是红黑二叉树,所以,它能够保证元素的排序和保证元素的不重复,即唯一性。下面给出两种方法的相应代码比较。
第一种方法,采用自然排序:
/********************************************************************/ import java.util.TreeSet; //使用TreeSet集合 的自然排序法对元素进行排序 public class TreeSetDemo1 { public static void main(String[] args) { TreeSet<Student> ts = new TreeSet<Student>(); ts.add(new Student("曹操", 34)); ts.add(new Student("刘备", 36)); ts.add(new Student("关羽", 34)); ts.add(new Student("张飞", 33)); ts.add(new Student("司马懿", 37)); ts.add(new Student("董卓", 39)); ts.add(new Student("赵子龙", 32)); for (Student i : ts) { System.out.println(i.getName() + " " + i.getAge()); } } } /********************************************************************/
/**************************************************************/ public class Student implements Comparable<Student> { @Override public int compareTo(Student s) { int num1 = this.getName().length() - s.getName().length(); int num2 = num1 == 0 ? this.getName().compareTo(s.getName()) : num1; int num3 = num2 == 0 ? this.getAge() - s.getAge() : num2; return num3; } private String name; private int 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 Student(String name, int age) { super(); this.name = name; this.age = age; } } /**************************************************************/
第二中,比较器:
import java.util.Comparator; import java.util.TreeSet; //使用比较器 public class TreeSetDemo2 { public static void main(String[] args) { TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { int num1 = s1.getName().length() - s2.getName().length(); int num2 = num1 == 0 ? s1.getName().compareTo(s2.getName()): num1; int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2; return num3; } }); ts.add(new Student("曹操", 34)); ts.add(new Student("刘备", 36)); ts.add(new Student("关羽", 34)); ts.add(new Student("张飞", 33)); ts.add(new Student("司马懿", 37)); ts.add(new Student("董卓", 39)); ts.add(new Student("赵子龙", 32)); for (Student i : ts) { System.out.println(i.getName() + " " + i.getAge()); } } }
public class Student { private String name; private int 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 Student(String name, int age) { super(); this.name = name; this.age = age; } }
相关文章推荐
- Java基础知识强化之集合框架笔记47:Set集合之TreeSet保证元素唯一性和比较器排序的原理及代码实现(比较器排序)
- Java基础知识强化之集合框架笔记44:Set集合之TreeSet保证元素唯一性和自然排序的原理和图解
- 《java入门第一季》之集合框架TreeSet存储元素自然排序以及图解
- 《java入门第一季》之集合框架TreeSet存储元素自然排序以及图解
- TreeSet集合的比较方式和元素唯一性的原理。
- 集合的特殊功能之TreeSet集合如何保证元素的唯一及排序的
- 使用HashSet和TreeSet存储多个商品信息,遍历并输出;其中商品属性:编号,名称,单价,出版社;要求向其中添加多个相同的商品,验证集合中元素的唯一性。 提示:向HashSet中添加自定义
- 黑马程序员对TreeSet集合中的元素排序的两种方式
- TreeSet(有序集合)对Comparable元素的排序(或使用Comparator)与元素equals方法的关系
- java基础—自定义一个比较器,对TreeSet 集合中的元素按指定方法来排序(java集合六)
- 黑马程序员------TreeSet集合框架存储自定义元素之排序Comparable与Comparator
- 集合框架_TreeSet的add()方法源码再次解读和TreeSet对元素排序的总结
- java 集合框架(TreeSet操作,自动对数据进行排序,重写CompareTo方法)
- TreeSet集合的add()方法源码解析(01.Integer自然排序)
- 自定义类的对象作为TreeSet元素的两种方法排序浅谈
- Java基础知识强化之集合框架笔记46:Set集合之TreeSet存储自定义对象并遍历练习2(自然排序)
- java集合(TreeSet自然排序)
- Java基础知识强化之集合框架笔记43:Set集合之TreeSet存储Integer类型的元素并遍历
- 黑马程序员——集合的特殊功能之HashSet集合如何保证元素的唯一性
- Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序)