TreeSet集合Comparable/Comparator


在这里插入图片描述

上节回顾: LinkedHashSet集合概述及特点

LinkedHashSet集合特点

  • 哈希表和链表实现Set接口,具有可预测的迭代次序
  • 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
  • 由哈希表保证元素唯一,也就是说没有重复元素

LinkedHashSet集合的储存和遍历:

import java.util.LinkedHashSet; /**
 * LinkedListSet 集合特点
 *      1.哈希表和链表实现Set接口,具有可预测的迭代次序
 *      2.由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
 *      3.由哈希表保证元素唯一,也就是说没有重复元素
 */ public class LinkedHashSetDemo { public static void main(String[] args) { //创建集合对象 LinkedHashSet<String> linkHashSet = new LinkedHashSet<String>(); //添加元素 linkHashSet.add("hello"); linkHashSet.add("world"); linkHashSet.add("java"); linkHashSet.add("hello"); //遍历集合(增强for) for(String s:linkHashSet){ System.out.println(s); } } } 

1.1 TreeSet集合概述和特点

java.util
类 TreeSet
java.lang.Object
继承者 java.util.AbstractCollection< E>
继承者 java.util.AbstractSet< E>
继承者 java.util.TreeSet< E>


public class TreeSet< E>
extends AbstractSet< E>
implements NavigableSet< E>, Cloneable, Serializable

基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。

1.2 构造方法:

构造方法 描述
TreeSet() 构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
TreeSet(Collection<? extends E> c) 构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。
TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。
TreeSet(SortedSet s) 构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。

1.3 方法摘要:

方法 说明
boolean add(E e) 将指定的元素添加到此 set(如果该元素尚未存在于 set 中)。
void clear() 移除此 set 中的所有元素。
Iterator iterator() 返回在此 set 中的元素上按升序进行迭代的迭代器。
boolean remove(Object o) 将指定的元素从 set 中移除(如果该元素存在于此 set 中)。

1.3 总结:

TreeSet集合特点

  • 元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方法取决于构造方法
    TreeSet() |构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
    TreeSet(Comparator<? super E> comparator) |构造一个新的空 TreeSet,它根据指定比较器进行排序。
  • 没有带索引的方法,所以不能使用普通for循环遍历
  • 由于是Set集合,所以不包含重复元素的集合

1.4 Demo:

package com.ithmm_03; import java.util.TreeSet; /**
 * TreeSet集合特点
 *
 * 元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方法取决于构造方法
 * TreeSet() |构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
 * TreeSet(Comparator<? super E> comparator) |构造一个新的空 TreeSet,它根据指定比较器进行排序。
 * 没有带索引的方法,所以不能使用普通for循环遍历
 * 由于是Set集合,所以不包含重复元素的集合
 */ public class TreeSetDemo01 { public static void main(String[] args) { //创建集合对象 TreeSet<Integer> ts = new TreeSet<Integer>(); //添加元素 ts.add(10); ts.add(40); ts.add(90); ts.add(30); ts.add(18); ts.add(30); //遍历集合(增强For) for(Integer s:ts){ System.out.println(s); } } } 

控制台输出:10 18 30 40 90

1.5 自然排序Comparable的使用

接口 Comparable< T>

  • 类型参数:
    T - 可以与此对象进行比较的那些对象的类型

此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。

实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

总结:

  • 用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
  • 自认排序,就是让元素所属的类实现Compareable接口,重写compareTo(To)方法
  • 重写方法时,一定注意排序规则必须按照要求的主要条件和次要调价来写

Demo:

  • 储存学生对象并遍历,创建TreeSet集合使用无参构造
  • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字幕顺序排序
    学生类:
package com.ithmm_03; public class Student implements Comparable<Student> { private String name; private int age; public Student() { } public Student(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; } @Override public int compareTo(Student s) { //  return 0;//认为是重复元素,不添加 // return 1;//升序存储 // return -1;//降序存储 //按照年龄从从小到大排序 int num = this.age - s.age; //按照年龄从大到小排序 //int num = s.age - this.age; //年龄相同时,按照姓名首字母顺序排序 int num2 = num==0?this.name.compareTo(s.name):num; return num2; } } 

测试类:

import java.util.TreeSet; public class TreeSetDemo02 { public static void main(String[] args) { //创建集合对象 TreeSet <Student> ts = new TreeSet<Student>(); //创建学生对象 Student s1 = new Student("xiaozhan",29); Student s2 = new Student("wangyi",24); Student s3 = new Student("hanyan",30); Student s4 = new Student("zhaoxiao",18); Student s5 = new Student("liubing",18); //把学生添加到集合 ts.add(s1); ts.add(s2); ts.add(s3); ts.add(s4); ts.add(s5); //遍历集合 for(Student s : ts){ System.out.println(s.getName() + " " + s.getAge()); } } } 

控制台输出:
liubing 18
zhaoxiao 18
wangyi 24
xiaozhan 29
hanyan 30

1.6 比较器排序Comparator的使用

Demo:

  • 存储学生对象并遍历,创建TreeSet集合使用带参构造方法
  • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字幕顺序排序
    学生类:
public class Student { private String name; private int age; public Student() { } public Student(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; } } 

测试类:

import java.util.TreeSet; public class TreeSetDemo02 { public static void main(String[] args) { //创建集合对象 TreeSet <Student> ts = new TreeSet<Student>(); //创建学生对象 Student s1 = new Student("xiaozhan",29); Student s2 = new Student("wangyi",24); Student s3 = new Student("hanyan",30); Student s4 = new Student("zhaoxiao",18); Student s5 = new Student("liubing",18); //把学生添加到集合 ts.add(s1); ts.add(s2); ts.add(s3); ts.add(s4); ts.add(s5); //遍历集合 for(Student s : ts){ System.out.println(s.getName() + " " + s.getAge()); } } } 

总结:

  • 用TreeSet集合存储自定义对象,代参构造方法使用的是比较器排序对元素进行排序的
  • 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(To1,To2)方法
  • 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件


全部评论

相关推荐

Gaynes:查看图片
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务