Java集合类之TreeSet的用法详解
作者:小新爱学习.
上节回顾
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); } } }
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 进行排序,具体取决于使用的构造方法。
构造方法
构造方法 | 描述 |
---|---|
TreeSet() | 构造一个新的空 set,该 set 根据其元素的自然顺序进行排序 |
TreeSet(Collection<? extends E> c) | 构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序 |
TreeSet(Comparator<? super E> comparator) | 构造一个新的空 TreeSet,它根据指定比较器进行排序 |
TreeSet(SortedSet s) | 构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet |
方法摘要
方法 | 说明 |
---|---|
boolean add(E e) | 将指定的元素添加到此 set(如果该元素尚未存在于 set 中) |
void clear() | 移除此 set 中的所有元素 |
Iterator iterator() | 返回在此 set 中的元素上按升序进行迭代的迭代器 |
boolean remove(Object o) | 将指定的元素从 set 中移除(如果该元素存在于此 set 中) |
总结
TreeSet集合特点
元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方法取决于构造方法
- TreeSet() |构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
- TreeSet(Comparator<? super E> comparator) |构造一个新的空 TreeSet,它根据指定比较器进行排序。
没有带索引的方法,所以不能使用普通for循环遍历
由于是Set集合,所以不包含重复元素的集合
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
自然排序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
比较器排序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)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件
到此这篇关于Java集合类之TreeSet的用法详解的文章就介绍到这了,更多相关Java TreeSet内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!