对HashMap按值和按键进行排序操作

HashMap本身是无序的,但是HashMap的排序却是一个比较常见的问题,我们可以借助List和LinkedHashMap,对List排序,再把List中的结果存储到LinkedHashMap中。

import java.util.*;

class Student{
    private String name;
    private int age;

    public Student(String name, int age) {
        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 "Student{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}


/**
 * hashMap的键是String,值是自定义对象(学生)				   
 * 首先按照学生的年龄升序,然后按照键降序
 */
public class HashMapSorted {
    public static void main(String[] args) {
        Map<String,Student>map = new HashMap<>();
        map.put("a",new Student("z3",18));
        map.put("c",new Student("li4",15));
        map.put("b",new Student("w5",20));
        System.out.println(map);//输出原始的map值


        //按值进行排序----按照学生年龄升序
        List<Map.Entry<String,Student>> list1 = new ArrayList<>(map.entrySet());
		//然后利用Collections工具类对List集合升序
        Collections.sort(list1, new Comparator<Map.Entry<String, Student>>() {
            @Override
            public int compare(Map.Entry<String, Student> o1, Map.Entry<String, Student> o2) {
            	//用学生的年龄进行比较
                return o1.getValue().getAge() - o2.getValue().getAge();
            }
        });
        //LinkedHashMap是有序的,所以将排序后的结果放到LinkedHashMap中
        Map<String,Student>result1 = new LinkedHashMap<>();
        for (Map.Entry<String,Student> entry : list1) {
            result1.put(entry.getKey(),entry.getValue());
        }
        System.out.println(result1);//输出按照值排序的结果


		//按照键进行排序-----倒序
        List<Map.Entry<String,Student>> list2 = new ArrayList<>(map.entrySet());
        Collections.sort(list2, new Comparator<Map.Entry<String, Student>>() {
            @Override
            public int compare(Map.Entry<String, Student> o1, Map.Entry<String, Student> o2) {
            	//可以用String类型compareTo的方法。
                return o2.getKey().compareTo(o1.getKey());
            }
        });
        Map<String,Student>result2 = new LinkedHashMap<>();
        for (Map.Entry<String,Student> entry : list2) {
            result2.put(entry.getKey(),entry.getValue());
        }
        System.out.println(result2);//输出按照键排序的结果
    }
}

运行结果:

{a=Student{name='z3', age='18'}, b=Student{name='w5', age='20'}, c=Student{name='li4', age='15'}}
{c=Student{name='li4', age='15'}, a=Student{name='z3', age='18'}, b=Student{name='w5', age='20'}}
{c=Student{name='li4', age='15'}, b=Student{name='w5', age='20'}, a=Student{name='z3', age='18'}}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

corlor_龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值