TreeMap 集合
一、数据结构
- 数据结构:红黑树
- 特点:可以排序
- 排序方法:自然排序 or 比较器排序
- 可参考类似文章:《Java集合框架——TreeSet集合》
二、自然排序
- 自然排序的对象必须实现Comparable接口,使对象具有比较性
- 构造方法:TreeMap()
- 使用键的自然顺序构造一个新的、空的树映射
//TreeMap<String, String>
package com.map.demo4;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapTest {
public static void main(String[] args) {
TreeMap<String, String> map = new TreeMap<String, String>();
map.put("zhangsan", "北京");
map.put("lisi", "上海");
map.put("wangwu", "广州");
map.put("zhaoliu", "深圳");
map.put("maqi", "四川");
Set<Entry<String, String>> entrySet = map.entrySet();
for (Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey() + "-----" + entry.getValue());
}
}
}
***执行结果:***
lisi-----上海
maqi-----四川
wangwu-----广州
zhangsan-----北京
zhaoliu-----深圳
//TreeMap<Integer, String>
package com.map.demo4;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapTest2 {
public static void main(String[] args) {
TreeMap<Integer, String> map = new TreeMap<Integer, String>();
map.put(1, "北京");
map.put(4, "上海");
map.put(3, "广州");
map.put(5, "深圳");
map.put(2, "四川");
Set<Entry<Integer, String>> entrySet = map.entrySet();
for (Entry<Integer, String> entry : entrySet) {
System.out.println(entry.getKey() + "-----" + entry.getValue());
}
}
}
***执行结果:***
1-----北京
2-----四川
3-----广州
4-----上海
5-----深圳
//TreeMap<Person, String>
//Person.java
package com.map.demo4;
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
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 String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Person p) {
int num1 = this.name.compareTo(p.getName());
int num2 = num1==0 ? this.age-p.getAge() : num1;
return num2;
}
}
//TreeMapTest3.java
package com.map.demo4;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapTest3 {
public static void main(String[] args) {
TreeMap<Person, String> map = new TreeMap<Person, String>();
Person p1 = new Person("张三", 18);
Person p2 = new Person("李四", 19);
Person p3 = new Person("王五", 20);
Person p4 = new Person("赵六", 21);
Person p5 = new Person("马七", 22);
map.put(p1, "北京");
map.put(p2, "上海");
map.put(p3, "深圳");
map.put(p4, "广州");
map.put(p5, "四川");
Set<Entry<Person, String>> entrySet = map.entrySet();
for (Entry<Person, String> entry : entrySet) {
System.out.println(entry.getKey() + "-----" + entry.getValue());
}
}
}
***执行结果:***
Person [name=张三, age=18]-----北京
Person [name=李四, age=19]-----上海
Person [name=王五, age=20]-----深圳
Person [name=赵六, age=21]-----广州
Person [name=马七, age=22]-----四川
三、比较器排序
- 构造方法:TreeMap(Comparator<? super K> comparator)
- 构造一个新的、空的树映射,该映射根据给定比较器进行排序
package com.map.demo4;
import java.util.Map.Entry;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapTest4 {
public static void main(String[] args) {
TreeMap<Person, String> map = new TreeMap<Person, String>(new Comparator<Person>() {
//匿名内部类实现比较器对象
@Override
public int compare(Person p1, Person p2) {
int num1 = p1.getName().compareTo(p2.getName());
int num2 = num1==0 ? p1.getAge()-p2.getAge() : num1;
return num2;
}
});
Person p1 = new Person("张三", 18);
Person p2 = new Person("李四", 19);
Person p3 = new Person("王五", 20);
Person p4 = new Person("赵六", 21);
Person p5 = new Person("马七", 22);
map.put(p1, "北京");
map.put(p2, "上海");
map.put(p3, "深圳");
map.put(p4, "广州");
map.put(p5, "四川");
Set<Entry<Person, String>> entrySet = map.entrySet();
for (Entry<Person, String> entry : entrySet) {
System.out.println(entry.getKey() + "-----" + entry.getValue());
}
}
}
***执行结果:***
Person [name=张三, age=18]-----北京
Person [name=李四, age=19]-----上海
Person [name=王五, age=20]-----深圳
Person [name=赵六, age=21]-----广州
Person [name=马七, age=22]-----四川