TreeMap学习
1、介绍
HashMap
是一种以空间换时间的映射表,它的实现原理决定了内部的Key是无序的,即遍历HashMap
的Key时,其顺序是不可预测的(但每个Key都会遍历一次且仅遍历一次)。
还有一种Map
,它在内部会对Key进行排序,这种Map
就是SortedMap
。注意到SortedMap
是接口,它的实现类是TreeMap
。
2、简单使用
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: Ambition
* @Description TODO
* @Date: 2021/9/10 9:27 下午
* @Version 1.0
*/
public class TreeMapDemo {
public static void main(String[] args) {
Map<Integer, String> treeMap = new TreeMap<>();
treeMap.put(7000, "小明");
treeMap.put(5000, "小王");
treeMap.put(6000, "小李");
// 1、key进行排序
// TreeMap 按照key来排序 默认会按照生序排列 hashmap是无序的
// hashmap的存储效率更高,因为hashmap没有排序比较
System.out.println(treeMap);
treeMap.forEach((k, v) -> {
System.out.println(k + " : " + v);
});
}
}
3、如何实现降序排序呢?
我们可以实现Comparator接口来自定义我们的排序
import java.util.Comparator;
public class DesSorter implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
// o1 - o2 升序
// o2 - o1 降序
return o2 - o1;
}
}
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: Ambition
* @Description TODO
* @Date: 2021/9/10 9:27 下午
* @Version 1.0
*/
public class TreeMapDemo {
public static void main(String[] args) {
System.out.println("降序排序++++++++++++++++++++++++");
Map<Integer, String> treeMap2 = new TreeMap<>(new DesSorter());
treeMap2.put(7000, "小明");
treeMap2.put(5000, "小王");
treeMap2.put(6000, "小李");
System.out.println(treeMap2);
}
}
4、如何实现对某个实体类里面的字段自定义排序呢?
4、1定义一个实体类(我们比较其中的score字段)
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private Integer id;
private String name;
private Integer score;
}
4、2实现我们的比较接口
public class StuScoreComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o1.getScore() - o2.getScore();
}
}
4、3示例一
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
/**
* @Author: Ambition
* @Description TODO
* @Date: 2021/9/10 9:27 下午
* @Version 1.0
*/
public class TreeMapDemo {
public static void main(String[] args) {
// 2、对类里面的某个字段进行排序
// 第一种方法
Map<Student, String> treeMap3 = new TreeMap<>(new StuScoreComparator());
treeMap3.put(new Student(100, "小明", 88), "st1");
treeMap3.put(new Student(200, "小王", 55), "st2");
treeMap3.put(new Student(300, "小李", 99), "st3");
treeMap3.forEach((k, v) -> {
System.out.println(k + " : " + v);
});
}
}
4、4示例二
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: Ambition
* @Description TODO
* @Date: 2021/9/10 9:27 下午
* @Version 1.0
*/
public class TreeMapDemo {
public static void main(String[] args) {
//第二种方法
Map<Student, String> treeMap4 = new TreeMap<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getScore() - o1.getScore();
}
});
treeMap4.put(new Student(100, "小明", 88), "st1");
treeMap4.put(new Student(200, "小王", 55), "st2");
treeMap4.put(new Student(300, "小李", 99), "st3");
treeMap4.forEach((k, v) -> {
System.out.println(k + " : " + v);
});
}
}
5、案例学习–demo
比如我们需要统计文本中的词频
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.TreeMap;
/**
* @Author: Ambition
* @Description TODO
* @Date: 2021/9/12 2:20 下午
* @Version 1.0
*/
public class TreeMapTest {
public static void main(String[] args) {
String text = "do you understand the feeling of missing someone it is just like that you will spend a long hard time to turn the ice-cold water you have drunk into tears";
Map<String, Integer> treeMap = new TreeMap<String, Integer>();
String[] split = text.split(" ");
for (String s : split) {
// 这一步可以省略,主要是为了去除差异化,全部转为小写的形式
String key = s.toLowerCase(Locale.ROOT);
if (key.length() > 0) {
// Java 8 Option 空指针判断并赋予默认值
Integer integer = Optional.ofNullable(treeMap.get(key)).orElse(1);
treeMap.put(key, integer + 1);
}
}
// java 8 strem 来迭代我们的对象
treeMap.forEach((k, v) -> {
System.out.println("key: " + k + " -- value: " + v);
});
}
}
评论区