TreeMap
在此之前 ,如果你了解HashMap和HashSet,那么对于这一章的内容就会有更深层次的理解,如果你还没有学习到,那么可以先看我的这篇博客:https://blog.youkuaiyun.com/Adepth/article/details/134935429
由关系图可知,TreeMap实现Map接口类,其与HashMap的最大区别就是,此插入的Key-Value数据输出时是有序的,例如:
public class treemap {
public static void main(String[] args) {
Map<Integer,Integer> map = new TreeMap<>();
map.put(1,2);
map.put(2,38);
map.put(9,37);
map.put(7,31);
map.put(11,32);
map.put(2,30);
map.put(8,30);
map.put(10,30);
System.out.println(map);
}
}
很容易可以看出,TreeMap是根据key值的大小顺序来进行排序的,而这也导致了--TreeMap的key是必须能够比较的类型,下面是报错显示
import java.util.Map;
import java.util.TreeMap;
public class treemap {
static class User{
public int age;
public int score;
}
public static void main(String[] args) {
Map<User,Integer> map = new TreeMap<>();
User user = new User();
User user1 = new User();
map.put(user,1);
}
}
故当我们的Key是自定义类型的时候,一定要使其类对象具有比较规则,那么我们实现就有两种方法
1.创建类比较器,在创建TreeMap对象的时候传入此类比较器来确定比较规则
2.实现Comparable接口,重写里面的compareTo方法
类比较器:按用户年龄排升序
public class treemap {
static class User {
public int age;
public int score;
@Override
public String toString() {
return "User{" +
"age=" + age +
", score=" + score +
'}';
}
}
//类比较器
static class userAgeComparator implements Comparator<User>{
@Override
public int compare(User o1, User o2) {
return o1.age - o2.age; //根据用户的年龄 升序排列
}
}
public static void main(String[] args) {
Map<User,Integer> map = new TreeMap<>(new userAgeComparator());
User user = new User();
User user1 = new User();
map.put(user,1);
System.out.println(map); //{User{age=0,score=0}=2}
}
}
实现Comparable接口(按用户分数排升序)
public class treemap {
static class User implements Comparable<User>{
public int age;
public int score;
public User(int age,int score){
this.age = age;
this.score = score;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", score=" + score +
'}';
}
@Override
public int compareTo(User o) {
return this.score - o.score;
}
}
public static void main(String[] args) {
Map<User,Integer> map = new TreeMap<>();
User user1 = new User(22,70);
User user2 = new User(20,60);
map.put(user1,1);
map.put(user2,2);
for (Map.Entry<User,Integer> entry : map.entrySet()){
System.out.println(entry);
}
}
}
TreeSet
TreeSet是纯Key模型,Key只能是唯一的,且不同于HashSet的是,TreeSet的Key不能传入null
与TreeMap相同特征的是,插入TreeSet内的值也是按照Key的大小排好序的
public static void main(String[] args) {
Set<Integer> set = new TreeSet();
set.add(2);
set.add(0);
set.add(8);
set.add(5);
set.add(9);
set.add(3);
set.add(1);
System.out.println(set);
}
TreeSet在添加自定义类型的元素是,一样是要实现类可比较的规则,其实现的方式与上面一样(Comparator和Comparable)
都知道Set集合具有去重的功能,那么在存储自定义类型的时候,是如何进行去重的呢?
User按分数排升序:
public class treemap {
static class User implements Comparable<User>{
public int age;
public int score;
public User(int age,int score){
this.age = age;
this.score = score;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", score=" + score +
'}';
}
@Override
public int compareTo(User o) {
return this.score - o.score;
}
}public static void main(String[] args) {
Set<User> set = new TreeSet();
User user1 = new User(1,2);
User user2 = new User(2,1);
set.add(user1);
set.add(user2);
System.out.println(set);
}
}
public static void main(String[] args) {
Set<User> set = new TreeSet();
User user1 = new User(1,1);
User user2 = new User(1,1);
set.add(user1);
set.add(user2);
System.out.println(set);
}
当我们添加的元素对象,是两个其属性值一模一样的时,我们发现,set集合内只有一个元素
而这也说明了,当存储的类型是自定义类型,且对象里的属性值一模一样时,这时候就会触发set集合的去重功能,只存储一个对象进来