TreeMap:
TreeMap跟TreeSet底层原理一样,都是红黑树结构的,增删改查性能较好
由键决定特性:不重复,无索引,可排序
可排序:对键进行排序
注意:默认按照简单从小到大进行排序,也可以自己规定键的排序顺序
代码书写两种规则:
①实现Comparable接口,制定比较规则
②创建集合时传递Comparator比较器对象,指定比较规则
如果两种规则同时存在,以第二个为主
练习:TreeMap基本应用
需求1:
键:整数表示id;值:字符串表示商品名称
要求:按照id的升序排列、按照id的降序排列
(1)按照id升序排列(默认是升序)
package mymapdemo;
import java.util.TreeMap;
public class TreeMapDemo1 {
public static void main(String[] args) {
//1.创建集合对象
//Integer Double默认情况下都是按照升序排列的
//String 按照字母在ASCII码表中对应的数字升序进行排列
TreeMap<Integer,String> tm=new TreeMap<>();
//2.添加元素
tm.put(1,"可乐");
tm.put(3,"果冻");
tm.put(5,"辣条");
tm.put(4,"饼干");
tm.put(2,"雪糕");
//3.打印集合
System.out.println(tm);
}
}
运行结果:
(2)按照id降序排列
package mymapdemo;
import java.util.Comparator;
import java.util.TreeMap;
public class TreeMapDemo1 {
public static void main(String[] args) {
//1.创建集合对象
//Integer Double默认情况下都是按照升序排列的
//String 按照字母在ASCII码表中对应的数字升序进行排列
TreeMap<Integer,String> tm=new TreeMap<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//o1表示当前要添加的元素,o2表示已经在红黑树中存在的元素
return o2-o1;
}
});
//2.添加元素
tm.put(1,"可乐");
tm.put(3,"果冻");
tm.put(5,"辣条");
tm.put(4,"饼干");
tm.put(2,"雪糕");
//3.打印集合
System.out.println(tm);
}
}
运行结果:
需求2:
键:学生对象;值:籍贯
要求:按照学生年龄的升序排列,年龄一样按照姓名的字母排列,同姓名,年龄视为同一个人
package mymapdemo;
import java.util.TreeMap;
public class TreeMapDemo2 {
public static void main(String[] args) {
//1.创建集合
TreeMap<Student,String> tm=new TreeMap<>();
//2.创建三个学生对象
Student s1=new Student("zhangsan",25);
Student s2=new Student("lisi",23);
Student s3=new Student("wangwu",24);
//3.添加元素
tm.put(s1,"黑龙江");
tm.put(s2,"吉林");
tm.put(s3,"辽宁");
//4.打印集合
System.out.println(tm);
}
}
运行结果:
练习:统计个数
需求:字符串“aababcabcdabcde”
请统计字符串中每一个字符出现的次数,并按照一下格式输出
a(5)b(4)c (3)d(2)e(1)
package mymapdemo;
import java.util.HashMap;
import java.util.StringJoiner;
import java.util.TreeMap;
import java.util.function.BiConsumer;
public class TreeMapDemo3 {
public static void main(String[] args) {
//新的统计思想:利用map集合进行统计
//HashMap:如果题目中没有要求对结果进行排序,默认使用HashMap
//Treemap:如果题目中要求对结果进行排序,使用TreeMap
//键表示要统计的内容;值表示次数
//1.定义字符串
String s="aababcabcdabcde";
//3.创建集合
TreeMap<Character,Integer> tm=new TreeMap<>();
//2.遍历字符串得到里面的每一个字符
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
//拿着c到集合中判断是否存在
//存在,表示当前字符又出现了一次
//不存在,表示当前字符第一次出现
if(tm.containsKey(c)){
//存在
//先把已经出现的数拿出来
int count = tm.get(c);
count++;
//把自增之后的结果添加到集合当中
tm.put(c,count);
}else{
tm.put(c,1);
}
}
//4.遍历集合,并按照指定格式进行拼接
//4.1 StringBuilder方式拼接
// StringBuilder sb=new StringBuilder();
// tm.forEach(( key, value)-> sb.append(key).append("(").append(value).append(")"));
// System.out.println(sb);
//4.2 StringJoiner方式拼接
StringJoiner sj=new StringJoiner("","","");
tm.forEach(( key, value)-> sj.add(key+"").add("(").add(value+"").add(")"));
System.out.println(sj);
}
}
运行结果: