TreeSet
TreeSet是SortedTree的实现类,所以TreeSet里面的元素需要排序,排序方法分为自然排序和指定排序
- TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。
- TreeSet 实现了NavigableSet接口,意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。
- TreeSet 实现了Cloneable接口,意味着它能被克隆。
- TreeSet 实现了java.io.Serializable接口,意味着它支持序列化。
- TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。
TreeSet例子
自然排序
自定义类对象,继承Comparable接口,实现接口里面的compareTo(Object o)的方法,比较两个类对象,前者大返回1,后者大返回负整数,相等返回0。
自定义Person类,继承Comparable接口
package com.cwstd.day3;
import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;
import java.util.Objects;
import java.util.stream.Collector;
//继承Comparable接口
public class Person implements Comparable {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
//实现继承Comparable的compareTo方法
@Override
public int compareTo(Object o) {
Person person=null;
if(o instanceof Person)
{
person=(Person) o;
Comparator comparator =Collator.getInstance(Locale.CHINA);
int res=comparator.compare(this.name,person.getName());
if(res==0)
{
res=this.age>person.getAge()?1:(this.age==person.getAge()?0:-1);
}
return res;
}
return 0;
}
}
测试类
package com.cwstd.day3;
import org.junit.Test;
import java.util.TreeSet;
public class TreeSetTest {
@Test
public void add()
{
TreeSet<Person> treeSet = new TreeSet<>();
treeSet.add(new Person("从西",12));
treeSet.add(new Person("啊伟",12));
for(Person p:treeSet)
{
System.out.println(p.getName());
System.out.println(p.getAge());
}
}
}
注意:TreeSet类使用比较类来判断是否相等,并不需要HashSet的hashCode()和equals()方法来判断是否相等。(自定义类时候三个方法最好都加上)
指定排序
指定排序是使用三方接口Comparator,不是为TreeSet专门设计的,当指定排序与自然排序同时出现时,生效的是指定排序。
定义指定排序类PersonComparator
package com.cwstd.day3;
import java.text.Collator;
import java.util.Comparator;
import java.util.Locale;
public class PersonComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
Person person1=null;
Person person2=null;
if(o1 instanceof Person && o2 instanceof Person)
{
person1=(Person) o1;
person2=(Person) o2;
Comparator comparator = Collator.getInstance(Locale.CHINA);
int res=comparator.compare(person1.getName(),person2.getName());
if(res==0)
{
res=person1.getAge()>person2.getAge()?1:(person1.getAge()==person2.getAge()?0:-1);
}
return res;
}
return 0;
}
}
测试类
package com.cwstd.day3;
import org.junit.Test;
import java.util.TreeSet;
public class TreeSetTest {
@Test
public void add()
{
TreeSet<Person> treeSet1 = new TreeSet<>(new PersonComparator());//传入比较类
treeSet1.add(new Person("从西",12));
treeSet1.add(new Person("啊伟",12));
for(Person p:treeSet1)
{
System.out.println(p.getName());
System.out.println(p.getAge());
}
}
}