TreeMap

image
image

两种排序方法同时存在时,以第二种为准。

Integer默认从小到大升序排列,而现在如果我们想要降序,默认的比较规则不能满足需求,这个时候就可以用第二种方式指定比较规则。

image

默认情况下就是按键的升序排列,因为Integer实现了Comparable接口

image
image

Interger中:
image
image

Integer Double 默认情况下都是按照升序排列的
String 按照字母在Ascii码表中对应的数字进行升序排列 abcdefg...

  • 升序排列
点击查看代码
package com.tiheima.a01mymap;

import java.util.TreeMap;

public class TreeMapDemo2 {
    public static void main(String[] args) {
        TreeMap<Integer, String> tm = new TreeMap<>();

        //Integer Double 默认情况下都是按照升序排列的
        //String 按照字母在Ascii码表中对应的数字进行升序排列 abcdefg...

        tm.put(2, "铅笔");
        tm.put(1, "可乐");
        tm.put(3, "雪碧");
        tm.put(4, "泡泡糖");

        System.out.println(tm);
    }
}

  • 降序排列

创建集合对象时,传递比较器对象

点击查看代码
package com.tiheima.a01mymap;

import java.util.Comparator;
import java.util.TreeMap;

public class TreeMapDemo1 {
    public static void main(String[] args) {
        TreeMap<Integer, String> tm = new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });

        tm.put(2, "铅笔");
        tm.put(1, "可乐");
        tm.put(3, "雪碧");
        tm.put(4, "泡泡糖");

        System.out.println(tm);

    }
}

image

键是自定义对象,需要指定排序规则

点击查看代码
package com.tiheima.a01mymap;

import java.util.Comparator;

public class Student1 implements Comparable<Student1> {
    private String name;
    private int age;

    public Student1() {
    }

    public Student1(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student1{name = " + name + ", age = " + age + "}";
    }


    @Override
    //this:表示当前要添加的元素
    //o:表示已经在红黑树存在的元素
    //返回值:
    //负数:表示当前要添加的元素是小的,存左边
    //正数:表示当前要添加的元素是大的,存右边
    //0:表示当前要添加的元素已经存在,舍弃

    public int compareTo(Student1 o) {
        //按年龄升序排列
        int i = this.getAge() - o.getAge();
        //年龄一样按照姓名的字母排列
        //这里的compareTo就是按照字符串里面的每一个字符按照ASCII码表升序排列
        i = i == 0 ? this.getName().compareTo(o.getName()) : i;
        return i;
    }
}

点击查看代码
package com.tiheima.a01mymap;

import java.util.TreeMap;

public class TreeMapDemo3 {
    public static void main(String[] args) {
        TreeMap<Student1, String> tm = new TreeMap<>();

        Student1 s1 = new Student1("zhangsan", 23);
        Student1 s2 = new Student1("lisi", 24);
        Student1 s3 = new Student1("wangwu", 25);
        Student1 s4 = new Student1("zhaoliu", 23);

        tm.put(s1, "河南");
        tm.put(s2, "上海");
        tm.put(s3, "山东");
        tm.put(s4, "四川");

        System.out.println(tm);
    }
}

image

如果题目中没有要求对结果进行排序,默认使用HashMap
如果题目中要求对结果进行排序,则使用TreeMap

点击查看代码
public class TreeMapDemo4 {
    public static void main(String[] args) {
        /*
        需求:字符串"aababcabcdabcde"
        请统计字符串中每一个字符出现的次数,并按照以下格式输出输出结果:
        a(5)b(4)c(3)d(2)e(1)

        键:要统计的内容
        值:表示次数
        如果题目中没有要求对结果进行排序,默认使用HashMap
        如果题目中要求对结果进行排序,则使用TreeMap
        */

        //1.定义字符串
        String s = "aababcabcdabcde";

        //2.创建集合
        TreeMap<Character, Integer> tm = new TreeMap<>();

        //3.遍历字符串得到里面的每一个字符
        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.按照指定格式打印
        StringBuilder sb = new StringBuilder();
        tm.forEach((key, value) -> sb.append(key).append("(").append(value).append(")"));

        System.out.println(sb);

    }
}
posted @ 2025-09-04 14:53  lachii  阅读(6)  评论(0)    收藏  举报