TreeSet:
TreeSet要注意的事项:
-
往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序(1,2,3… a,b,c…)的特性进行排序存储
-
往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类可以实现实现Comparable接口,把元素的比较规则定义在CompareTo(T o)方法上。
-
如果比较元素的时候,compareTo方法返回的是0,那么该元素就被视为重复元素,不允许添加。(注意:TreeSet与HashCode、equals方法没有任何关系)
-
往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。如何自定义比较器:自定义一个类实现Comparator接口即可,把元素与元素的比较规则定义在compare方法中。自定义比较器的格式:class 类名 implements Comparator{} 推荐使用Comparator比较器
-
往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类即实现了Comparable接口,在创建对象的时候也传入了比较器,那么是以比较器的比较规则优先使
-
TreeSet是可以对字符串进行排序的,因为字符串已经实现了Comparable接口
字符串比较规则:逐个字符串取每个字符按自然顺序进行比较举例1:
class Emp implements Comparable{ int id; String name; int age; public Emp(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } @Override public String toString() { return "{编号:"+this.id+" 姓名:"+this.name+" 年龄:"+this.age+"}"; } //元素与元素之间的比较规则 public int compareTo(Object o) { Emp e=(Emp) o; System.out.println(this.name+" compare "+e.name); //用来输出哪两个元素进行了比较 return this.age-e.age; //根据元素的年龄进行排序 } } public class Tset { public static void main(String[] args) { //1.往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序(1,2,3... a,b,c...)的特性进行排序存储 TreeSet tree = new TreeSet(); tree.add(1); tree.add(6); tree.add(3); tree.add(8); tree.add(2); System.out.println(tree); //[1, 2, 3, 6, 8] //2.往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类可以实现实现Comparable接口,把元素的比较规则定义在CompareTo(T o)方法上。 TreeSet tree2 = new TreeSet(); tree2.add(new Emp(103, "猪悟能", 300)); tree2.add(new Emp(102, "孙悟空", 550)); tree2.add(new Emp(104, "沙悟净", 220)); tree2.add(new Emp(101, "唐玄奘", 25)); //3.如果比较元素的时候,compareTo方法返回的是0,那么该元素就被视为重复元素,不允许添加 tree2.add(new Emp(105, "白龙马", 220)); //compareTo根据年龄进行比较,所以年龄相等的两个元素被视为重复元素 System.out.println(tree2); //[{编号:101 姓名:唐玄奘 年龄:25}, {编号:104 姓名:沙悟净 年龄:220}, {编号:103 姓名:猪悟能 年龄:300}, {编号:102 姓名:孙悟空 年龄:550}] } }
TreeSet存储原理:
举例2:
package com.test;
import java.util.Comparator;
import java.util.TreeSet;
//自定义比较器
class MyComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
Emp e1=(Emp) o1;
Emp e2=(Emp) o2;
return e1.id-e2.id; //根据元素的id进行比较
}
}
public class Tset2 {
public static void main(String[] args) {
//4.往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。
//5.往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类即实现了Comparable接口,在创建对象的时候也传入了比较器,那么是以比较器的比较规则优先使用
//创建一个比较器
MyComparator comparator=new MyComparator();
//创建TreeSet的时候传入比较器
TreeSet tree = new TreeSet(comparator);
tree.add(new Emp(101, "唐玄奘", 25)); //Emp实现了Comparable接口,但TreeSet也传入了自定义的比较器,使用自定义的比较器进行比较
tree.add(new Emp(102, "孙悟空", 550));
tree.add(new Emp(103, "猪悟能", 300));
tree.add(new Emp(104, "沙悟净", 220));
System.out.println(tree);
//[{编号:101 姓名:唐玄奘 年龄:25}, {编号:102 姓名:孙悟空 年龄:550}, {编号:103 姓名:猪悟能 年龄:300}, {编号:104 姓名:沙悟净 年龄:220}]
}
}
举例3:
package com.test;
import java.util.TreeSet;
public class Tset3 {
public static void main(String[] args) {
// 6.TreeSet是可以对字符串进行排序的,因为字符串已经实现了Comparable接口
// 字符串比较规则:
// 逐个字符串取每个字符按自然顺序进行比较
TreeSet tset=new TreeSet();
tset.add("acd");
tset.add("bde");
tset.add("abf");
tset.add("bcabc");
System.out.println(tset); //[abf, acd, bca, bcabc, bde]
}
}