TreeSet对String类型等是可排序的;
1.TreeSet集合底层实际上是一个TreeMap
2.TreeMap集合底层是一个二叉树
3.放到Treeset集合中的元素,等同于放到TreeMap集合Key部分
4.TreeSet集合中的元素:无序不可重复,但是可以按照元素的大小顺序自动排序,称为:可排序集合
package Mapiiiiii;
import java.util.TreeSet;
public class TreeSetStringtest {
public static void main(String[] args) {
TreeSet<String> treeSet=new TreeSet();
treeSet.add("ab");
treeSet.add("vrt");
treeSet.add("cft");
treeSet.add("bvf");
treeSet.add("abc");
treeSet.add("abd");
for(String str:treeSet){
System.out.println(str);
}
System.out.println("============");
TreeSet<Integer> tree=new TreeSet();
tree.add(1233);
tree.add(1);
tree.add(12);
tree.add(123);
tree.add(124);
for (Integer s:tree){
System.out.println(s);
}
}
}
对于自定义的类型来说,TreeSet无法进行自动排序
定义一个Student类型,对于Student类型来说,无法排序
因为没有指定Student对象之间的比较规则。
以下程序运行会出现异常:Mapiiiiii.Student cannot be cast to java.lang.Comparable
出现这个异常的原因是:
其他类型源码中都有Comparable。
Student类没有实现java.lang.Comparable接口
package Mapiiiiii;
import java.util.TreeSet;
public class ZDyitest {
public static void main(String[] args) {
TreeSet<Student> tree = new TreeSet<>();
Student s1 = new Student(32);
Student s2 = new Student(3);
Student s3 = new Student(40);
Student s4 = new Student(31);
tree.add(s1);
tree.add(s2);
tree.add(s3);
tree.add(s4);
//遍历
for (Student s: tree){
System.out.println(s);
}
}
}
class Student{
int age;
public Student(int age) {
this.age=age;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
'}';
}
}
放在TreeSet集合中的元素要实现:java.lang.Comparable接口,并且实现compareTo方法,equals方法可以不写
package Mapiiiiii;
import java.util.TreeSet;
public class ZDyitest {
public static void main(String[] args) {
TreeSet<Student> tree = new TreeSet<>();
Student s1 = new Student(32);
Student s2 = new Student(3);
Student s3 = new Student(40);
Student s4 = new Student(31);
tree.add(s1);
tree.add(s2);
tree.add(s3);
tree.add(s4);
//遍历
for (Student s: tree){
System.out.println(s);
}
}
}
//放在TreeSet集合中的元素要实现:java.lang.Comparable接口,
// 并且实现compareTo方法,equals方法可以不写**
class Student implements Comparable<Student>{
int age;
public Student(int age) {
this.age=age;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
'}';
}
//需要在这个方法中编写比较的逻辑,按照什么进行比较
//比较规则还是需要我们自己去写
//k.compareTo(t.key)
//拿着参数k和集合中的每一个元素k进行比较
@Override
public int compareTo(Student student) {
/*
this是c1 ,student是c2
c1和c2比较的时候,就是this和student比较
*/
return this.age-student.age;//用到了二叉排序树的知识
}
}
自己写了比较规则后就会按照自己的规则排序了。
再练习写一下比较规则
package Mapiiiiii;
import java.util.TreeSet;
public class ZidingRuletest {
public static void main(String[] args) {
TreeSet<user> tr=new TreeSet<>();
//以下两种方法都可以
/*user u1=new user("xiaoming",45);
user u2=new user("xiaohua",43);
user u3=new user("wanggui",45);
user u4=new user("lihai",21);
user u5=new user("zhangsan",25);
tr.add(u1);
tr.add(u2);
tr.add(u3);
tr.add(u4);
tr.add(u5);
*/
tr.add(new user("xiaoming",45));
tr.add(new user("xiaohua",43));
tr.add(new user("wanggui",45));
tr.add(new user("lihai",21));
tr.add(new user("zhangsan",25));
for(user u:tr){
System.out.println(u);
}
}
}
class user implements Comparable<user>{
String name;
int age;
public user() {
}
public user(String name,int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "user{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public int compareTo(user user) {
//年龄相同时按照名字排序
//姓名是String类型,可以直接调用compareTo来完成比较
if(this.age==user.age){
return this.name.compareTo(user.name);
}else
return this.age-user.age;
}
}