Java TreeSet
小新爱学习. 人气:0上节回顾
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)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件
加载全部内容