TreeSet
TreeSet是基于TreeMap实现的。不是线程安全的。TreeSet可以使用元素的自然顺序进行排序,或者定制排序
注:更多详细方法请自行在 API 上查找
排序方式
自然排序、定制排序
自然排序
实现 Comparable 接口,需要实现其 comparaTo() 方法。
Integer类:
compareTo(Integer o)
this == o 返回0 this > o 返回大于0的值, this < o 返回小于0的值
String类 :
compareTo(String str)
按照字典顺序(字母表的顺序)进行字符串的比较 本质上比较的是字符的 Unicode 值
package org.lanqiao.setdemo;
public class Student {
private String name;
private Integer 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 Integer getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
/*
* 实现compareTo方法。则是根据我们的比较规则,来定义,针对我们自己自定义的类型
* 进行比较的方式
* 1 我认为。如果两个同学的年龄相等的话,那么这两个同学就是同一个人
* 2 如果年龄相等,则按照姓名的字典顺序进行排序
*/
/*@Override
public int compareTo(Object o) {
Student st = (Student)o;
int res = age.compareTo(st.getAge());
if(res == 0) {
res = name.compareTo(st.getName());
}
return res;
}*/
}
package org.lanqiao.setdemo;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
/*
* TreeSet 可以对存入其中的元素进行排序
* 排序的方式由两种:自然排序,定制排序
* 自然排序:实现Comparable
*/
public static void main(String[] args) {
Set set = new TreeSet();
/*set.add(2);
set.add(5);
set.add(1);
set.add(6);
set.add(9);*/
/*set.add("b");
set.add("cd");
set.add("bcd");
set.add("abcd");*/
/*Student stu1 = new Student("aa",21);
Student stu2 = new Student("dd",18);
Student stu3 = new Student("cc",18);
Student stu4 = new Student("bb",22);
Student stu5 = new Student("ff",19);
set.add(stu1);
set.add(stu2);
set.add(stu3);
set.add(stu4);
set.add(stu5);*/
set.add("李四");
set.add("王五");
set.add("张三");
Iterator iter = set.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
char a = '张';
System.out.println((int)a);
char b = '王';
System.out.println((int)b);
char c = '李';
System.out.println((int)c);
}
}
定制排序
不是由存储的数据类型来决定数据的排序方式,而是将数据的排序的方式交由容器来定义,不同的容器可以选择不同的排序方式。
实现Comparator接口,实现 compare()
package org.lanqiao.setdemo;
import java.util.Comparator;
public class MyComparetor implements Comparator{
@Override
public int compare(Object o1, Object o2) {
Integer i1 = (Integer)o1;
Integer i2 = (Integer)o2;
return i1.compareTo(i2);
}
}
package org.lanqiao.setdemo;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo2 {
public static void main(String[] args) {
Set set = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Student st1 = (Student)o1;
Student st2 = (Student)o2;
int res = st1.getAge().compareTo(st2.getAge());
if(res == 0) {
res = st1.getName().compareTo(st2.getName());
}
return res;
}
}) ;
/*set.add(1);
set.add(5);
set.add(2);
set.add(6);
set.add(4);*/
Student stu1 = new Student("aa",21);
Student stu2 = new Student("dd",18);
Student stu3 = new Student("cc",18);
Student stu4 = new Student("bb",22);
Student stu5 = new Student("ff",19);
set.add(stu1);
set.add(stu2);
set.add(stu3);
set.add(stu4);
set.add(stu5);
Iterator iter = set.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
}
/*public class MyComparetor2 implements Comparator{
@Override
public int compare(Object o1, Object o2) {
Integer i1 = (Integer)o1;
Integer i2 = (Integer)o2;
return i1.compareTo(i2);
}
}*/
}
实现方式有三种:
- 使用外部类来实现接口
- 使用内部类来实现接口
- 使用匿名内部类来实现接口