资讯专栏INFORMATION COLUMN

java 键值对 按值排序

Moxmi / 1836人阅读

摘要:在最近写程序题的时候,需要存储一个为为的后来需要根据的长度对从小到大进行排序。用代替,然后中的元素为配对类,变相实现了一个键对应一个值的集合,并且能够排序。

在最近写程序题的时候,需要存储一个key为char,value为string的map,后来需要根据string的长度对map从小到大进行排序。

目标:

1.用Pair配对

一开始用的是HashMap,但是后面发现HashMap是无序的,于是想把HashMap的一个键值对取出来,存到集合里,再对集合进行自定义排序,上网搜到有一个配对的类Pair,他有一个key和一个value属性,想到用来代替HashMap的一个键值对。

用ArrayList代替HashMap,然后ArrayList中的元素为配对类,变相实现了一个键对应一个值的集合,并且能够排序。

首先存储配对到集合中:
       ArrayList> pairs = new ArrayList<>();
        Pair pair;
        pair = new Pair<>(1, "abc");
        pairs.add(pair);
        pair = new Pair<>(2, "abcd");
        pairs.add(pair);
        pair = new Pair<>(3, "ab");
        pairs.add(pair);
        pair = new Pair<>(4, "abcde");
        pairs.add(pair);
对集合进行排序

调用ArrayList对象的sort方法进行排序,他需要Comparator接口,有三种实现方法:

内部类进行排序
public class Main {

    public static void main(String[] args) {
        ArrayList> pairs = new ArrayList<>();
        Pair pair;
        pair = new Pair<>(1, "abc");
        pairs.add(pair);
        pair = new Pair<>(2, "abcd");
        pairs.add(pair);
        pair = new Pair<>(3, "ab");
        pairs.add(pair);
        pair = new Pair<>(4, "abcde");
        pairs.add(pair);
        pairs.sort(new Main().new StringCmp());//建立Main内部类的一个实例对象
    }
    //实现比较接口的内部类
    public class StringCmp implements Comparator{
        @Override
        public int compare(Object o1, Object o2) {
            Pair s1 = (Pair)o1;
            Pair s2 = (Pair)o2;
            return new Integer(s1.getValue().length()).compareTo(s2.getValue().length());
        }
    }
}
匿名内部类进行排序

如果不需要复用这个排序的方法,多带带为他写一个类太过浪费又不安全,可以使用匿名的内部类

public class Main {

    public static void main(String[] args) {
        ArrayList> pairs = new ArrayList<>();
        Pair pair;
        pair = new Pair<>(1, "abc");
        pairs.add(pair);
        pair = new Pair<>(2, "abcd");
        pairs.add(pair);
        pair = new Pair<>(3, "ab");
        pairs.add(pair);
        pair = new Pair<>(4, "abcde");
        pairs.add(pair);
        //使用匿名内部类
        pairs.sort(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                Pair s1 = (Pair)o1;
                Pair s2 = (Pair)o2;
                return new Integer(s1.getValue().length()).compareTo(s2.getValue().length());
            }
        });

    }
}

判断的代码雷同,只是不用在去新建一个类。

lambda表达式

lambda表达式就是匿名内部类的简写版:

import javafx.util.Pair;

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {
        ArrayList> pairs = new ArrayList<>();
        Pair pair;
        pair = new Pair<>(1, "abc");
        pairs.add(pair);
        pair = new Pair<>(2, "abcd");
        pairs.add(pair);
        pair = new Pair<>(3, "ab");
        pairs.add(pair);
        pair = new Pair<>(4, "abcde");
        pairs.add(pair);
        pairs.sort((pair1, pair2)->{return new Integer(pair1.getValue().length()).compareTo(new Integer(pair2.getValue().length()));});
    }
}
2.用TreeMap进行排序

用配对进行存储初步解决了目的,但是这样存储的就不是Map而是ArrayList的了,也就不能使用Map的方法,虽然解决了需求,但是感觉方向错了,去网上一搜,返现Map有能够排序的实现类TreeMap,他仅需创建时传入Comparator的接口实现类,就能够实现存储是排序了:

public class Main {

    public static void main(String[] args) {
        TreeMap treeMap = new TreeMap((s1, s2)->{
            return new Integer(s1.length()).compareTo(new Integer(s2.length()));
        });
        treeMap.put("abc", 1);
        treeMap.put("abcd", 2);
        treeMap.put("ab", 3);
        treeMap.put("abcde", 4);
    }
}

代码简短,通俗易懂,但是因为TreeMap只能按照key进行排序,而我的要求是根据value的长度进行排序,所有在这里我把key和value的类型互换了,但这样之前可以通过int类型的编号找到string类型值,在更改之后,就不能通过标号找到值了.虽然有好处良多,但是不符合我的情况.

3.HashMap转成list再排序

HashMap的对象有一个方法,他可以把所有的键值对集合转换为一个set集合,集合元素是Map.Entry,可以把HashMap转换为Set之后再转换成ArrayList再调用sort方法进行排序,达到根据value进行排序的效果:

public class Main {

    public static void main(String[] args) {
        HashMap hashMap = new HashMap<>();
        hashMap.put(1, "aec");
        hashMap.put(2, "abcd");
        hashMap.put(3, "ab");
        hashMap.put(4, "abcde");
        ArrayList> arrayList = new ArrayList<>(hashMap.entrySet());
        arrayList.sort((entry1, entry2)->{
            return new Integer(entry1.getValue().length()).compareTo(new Integer(entry2.getValue().length()));
        });
    }
}

感觉这是第一种方法,加上一个HashMap得到的结果,这样可以从按照value进行排序(排序结果保存在arrayList中),也可以从key找到value(在HashMap中),但是存储内存却浪费了,多了一个list,不知道有没有直接根据value直接排序的map.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71996.html

相关文章

  • Java中Map的排序

    摘要:的种类在中,的主要作用是存储键值对。保存了记录的插入顺序,在用遍历时,先得到的记录肯定是先插入的也可以在构造时用带参数,按照应用次数排序。按值排序由于中并没有此功能,所以我们需要自己实现。思路如下中是可以使用接口的。 Map的种类 在Java中,Map的主要作用是存储键值对。由于是根据键得到值,所以不允许键重复。它主要有如下几个类别: HashMap: 最常用的Map,它根据键的Ha...

    pkhope 评论0 收藏0
  • 看例子,学 Python(二)

    摘要:看例子,学二看例子,学一看例子,学三模块文件定义了函数和,就是一个模块。这个列表里的每个元素都是一个键值对,由元组表示。指定的为,便以每个键值对元组下标为的元素进行排序。可将其它序列类型转换成元组看例子,学一看例子,学三 看例子,学 Python(二) 看例子,学 Python(一)看例子,学 Python(三) 模块 文件 mymath.py 定义了函数 fib 和 fac,myma...

    CoderDock 评论0 收藏0
  • Java 集合Hashtable源码深入解析

    摘要:分别获取正序反序的键集。是用来实现机制的第部分源码解析基于为了更了解的原理,下面对源码代码作出分析。实现了迭代器和枚举两个接口获取的迭代器若的实际大小为则返回空迭代器对象否则,返回正常的的对象。 概要 前面,我们已经系统的对List进行了学习。接下来,我们先学习Map,然后再学习Set;因为Set的实现类都是基于Map来实现的(如,HashSet是通过HashMap实现的,TreeSe...

    Turbo 评论0 收藏0
  • Java集合框架——Map接口

    摘要:第三阶段常见对象的学习集合框架集合在实际需求中,我们常常会遇到这样的问题,在诸多的数据中,通过其编号来寻找某一些信息,从而进行查看或者修改,例如通过学号查询学生信息。面试题和的区别是单列集合的顶层接口,有子接口和。 第三阶段 JAVA常见对象的学习 集合框架——Map集合 showImg(https://segmentfault.com/img/remote/1460000019683...

    princekin 评论0 收藏0

发表评论

0条评论

Moxmi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<