TreeSet(红黑树)
基于排列顺序实现元素不重复 。 实现了SortedSet接口 ,对集合元素自动排序 。 元素对象的类型必须实现Comparable接口,指定排序规则 。 通过CompareTo方法确定是否为重复元素 。
参考代码
import java. util. Iterator;
import java. util. TreeSet;
public class Demo04 {
public static void main ( String[ ] args) {
TreeSet< String> treeSet = new TreeSet < > ( ) ;
treeSet. add ( "海贼王" ) ;
treeSet. add ( "琅琊榜" ) ;
treeSet. add ( "火影忍者" ) ;
treeSet. add ( "海贼王" ) ;
System. out. println ( "元素个数:" + treeSet. size ( ) ) ;
System. out. println ( treeSet. toString ( ) ) ;
treeSet. remove ( "火影忍者" ) ;
System. out. println ( "删除后:" + treeSet. size ( ) ) ;
System. out. println ( treeSet. toString ( ) ) ;
System. out. println ( "------增强for循环------" ) ;
for ( String string : treeSet) {
System. out. println ( string) ;
}
System. out. println ( "------迭代器------" ) ;
Iterator< String> it = treeSet. iterator ( ) ;
while ( it. hasNext ( ) ) {
System. out. println ( it. next ( ) ) ;
}
System. out. println ( treeSet. contains ( "海贼王" ) ) ;
System. out. println ( treeSet. isEmpty ( ) ) ;
}
}
Person类
import java. util. Objects;
public class Person implements Comparable < Person> {
private String name;
private int age;
public Person ( ) {
}
public Person ( 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 hashCode ( ) {
int n1 = this . name. hashCode ( ) ;
int n2 = this . age;
return n1 + n2;
}
@Override
public String toString ( ) {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}' ;
}
@Override
public boolean equals ( Object o) {
if ( this == o) {
return true ;
}
if ( o == null) {
return false ;
}
if ( o instanceof Person ) {
Person person = ( Person) o;
if ( this . name. equals ( person. getName ( ) ) && this . age == person. getAge ( ) ) {
return true ;
}
}
return false ;
}
@Override
public int compareTo ( Person o) {
int n1 = this . getName ( ) . compareTo ( o. getName ( ) ) ;
int n2 = this . age - o. getAge ( ) ;
return n1 == 0 ? n2 : n1;
}
}
使用TreeSet保存数据且Comparable接口的实现
import java. util. Iterator;
import java. util. TreeSet;
public class Demo05 {
public static void main ( String[ ] args) {
TreeSet< Person> persons = new TreeSet < > ( ) ;
Person p1 = new Person ( "liudehua" , 50 ) ;
Person p2 = new Person ( "huge" , 38 ) ;
Person p3 = new Person ( "caiwenjing" , 30 ) ;
Person p4 = new Person ( "caiwenjing" , 18 ) ;
persons. add ( p1) ;
persons. add ( p2) ;
persons. add ( p3) ;
persons. add ( p4) ;
System. out. println ( "元素个数:" + persons. size ( ) ) ;
System. out. println ( persons. toString ( ) ) ;
System. out. println ( "输出结果是按名字的字母顺序,字母相同按年龄" ) ;
persons. remove ( new Person ( "caiwenjing" , 18 ) ) ;
System. out. println ( persons. size ( ) ) ;
System. out. println ( "------增强for循环------" ) ;
for ( Person person : persons) {
System. out. println ( person) ;
}
System. out. println ( "------迭代器------" ) ;
Iterator it = persons. iterator ( ) ;
while ( it. hasNext ( ) ) {
System. out. println ( it. next ( ) ) ;
}
System. out. println ( persons. contains ( p4) ) ;
System. out. println ( persons. isEmpty ( ) ) ;
}
}
Comparator:实现定制比较(比较器)
import java. util. Comparator;
import java. util. TreeSet;
public class Demo06 {
public static void main ( String[ ] args) {
TreeSet< Person> per = new TreeSet < > ( new Comparator < Person> ( ) {
@Override
public int compare ( Person o1, Person o2) {
int n1 = o1. getAge ( ) - o2. getAge ( ) ;
int n2 = o1. getName ( ) . compareTo ( o2. getName ( ) ) ;
return n1 == 0 ? n2 : n1;
}
} ) ;
Person p1 = new Person ( "liudehua" , 50 ) ;
Person p2 = new Person ( "huge" , 38 ) ;
Person p3 = new Person ( "caiwenjing" , 30 ) ;
Person p4 = new Person ( "xiaoer" , 30 ) ;
per. add ( p1) ;
per. add ( p2) ;
per. add ( p3) ;
per. add ( p4) ;
System. out. println ( "元素个数:" + per. size ( ) ) ;
System. out. println ( per. toString ( ) ) ;
System. out. println ( "输出结果是按年龄大小,年龄相同按名字" ) ;
}
}
案例
import java. util. Comparator;
import java. util. TreeSet;
public class Demo07 {
public static void main ( String[ ] args) {
TreeSet< String> treeSet = new TreeSet < > ( new Comparator < String> ( ) {
@Override
public int compare ( String o1, String o2) {
int n1 = o1. length ( ) - o2. length ( ) ;
int n2 = o1. compareTo ( o2) ;
return n1 == 0 ? n2 : n1;
}
} ) ;
treeSet. add ( "hello" ) ;
treeSet. add ( "shi" ) ;
treeSet. add ( "wang" ) ;
treeSet. add ( "wahaha" ) ;
treeSet. add ( "zhang" ) ;
treeSet. add ( "li" ) ;
System. out. println ( treeSet. size ( ) ) ;
System. out. println ( treeSet. toString ( ) ) ;
System. out. println ( "输出结果是按元素的长度排列" ) ;
}
}