侧边栏壁纸
博主头像
Epoch

Java开发、Python爬虫、微服务、分布式、前端

  • 累计撰写 93 篇文章
  • 累计创建 110 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

Java学习--TreeMap学习

Epoch
2021-09-12 / 0 评论 / 0 点赞 / 331 阅读 / 989 字 / 正在检测是否收录...

TreeMap学习

1、介绍

HashMap是一种以空间换时间的映射表,它的实现原理决定了内部的Key是无序的,即遍历HashMap的Key时,其顺序是不可预测的(但每个Key都会遍历一次且仅遍历一次)。

还有一种Map,它在内部会对Key进行排序,这种Map就是SortedMap。注意到SortedMap是接口,它的实现类是TreeMap

image-20210912144756856

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);
        });
    }
    
}
0

评论区