Map实现类之三:TreeMap 实现类介绍

2020-11-19 0 By admin

TreeMap存储Key-Value 对时,需要根据key-value对进行排序。TreeMap可以保证所有的Key-Value 对处于有序状态。

一、TreeSet底层使用红黑树结构存储数据

TreeMap的Key的排序:

  1. 自然排序:TreeMap的所有的Key 必须实现Comparable接口,而且所有的Key应该是同一个类的对象,否则将会抛出ClasssCastException
  2. 定制排序:创建TreeMap时,传入一个Comparator 对象,该对象负责对TreeMap中的所有key 进行排序。此时不需要Map 的Key实现Comparable 接口

TreeMap判断两个key相等的标准:两个key通过compareTo()方法或者compare()方法返回0。

二、TreeMap 的自然排序和定制排序

2.1、自定义对象 User 类

public class User implements Comparable{
 private String name;
 private int age;
// 构造方法、getXX()、setXX()、toString()
 @Override
 public boolean equals(Object o) {
  System.out.println("User equals()....");
  if (this == o) return true;
  if (o == null || getClass() != o.getClass()) return false;
  User user = (User) o;
  if (age != user.age) return false;
  return name != null ? name.equals(user.name) : user.name == null;
 }
 @Override
 public int hashCode() { //return name.hashCode() + age;
  int result = name != null ? name.hashCode() : 0;
  result = 31 * result + age;
  return result;
 }
 //按照姓名从大到小排列,年龄从小到大排列
 @Override
 public int compareTo(Object o) {
  if(o instanceof User){
   User user = (User)o;
//   return -this.name.compareTo(user.name);
   int compare = -this.name.compareTo(user.name);
   if(compare != 0){
    return compare;
   }else{
    return Integer.compare(this.age,user.age);
   }
  }else{
   throw new RuntimeException("输入的类型不匹配");
  }
 }
}

2.2、测试类

public class TreeMapTest {
 /**
  * 向TreeMap中添加key-value,要求key必须是由同一个类创建的对象
  * 因为要按照key进行排序:自然排序 、定制排序
  */
 //自然排序
 @Test
 public void test(){
  TreeMap map = new TreeMap();
  User u1 = new User("Tom",23);
  User u2 = new User("Jerry",32);
  User u3 = new User("Jack",20);
  User u4 = new User("Rose",18);
  map.put(u1,98);
  map.put(u2,89);
  map.put(u3,76);
  map.put(u4,100);
  Set entrySet = map.entrySet();
  Iterator iterator1 = entrySet.iterator();
  while (iterator1.hasNext()){
   Object obj = iterator1.next();
   Map.Entry entry = (Map.Entry) obj;
   System.out.println(entry.getKey() + "---->" + entry.getValue());

  }
 }

 //定制排序
 @Test
 public void test2(){
  TreeMap map = new TreeMap(new Comparator() {
   @Override
   public int compare(Object o1, Object o2) {
    if(o1 instanceof User && o2 instanceof User){
     User u1 = (User)o1;
     User u2 = (User)o2;
     return Integer.compare(u1.getAge(),u2.getAge());
    }
    throw new RuntimeException("输入的类型不匹配!");
   }
  });
  User u1 = new User("Tom",23);
  User u2 = new User("Jerry",32);
  User u3 = new User("Jack",20);
  User u4 = new User("Rose",18);
  map.put(u1,98);
  map.put(u2,89);
  map.put(u3,76);
  map.put(u4,100);
  Set entrySet = map.entrySet();
  Iterator iterator1 = entrySet.iterator();
  while (iterator1.hasNext()){
   Object obj = iterator1.next();
   Map.Entry entry = (Map.Entry) obj;
   System.out.println(entry.getKey() + "---->" + entry.getValue());
  }
 }
}