`
wangqiang6028
  • 浏览: 88003 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

使 Map 中的值按放入顺序输出

    博客分类:
  • Java
阅读更多
在使用 Java 的 Hashmap 时,输出 Map 中的值如何使之按放入的顺序输出来,像 List 那样保持顺序。这里的顺序不是说对集合中的数据进行的排序,要是的话用 TreeMap,像 TreeSet 一样就行。 我们看个例子:
Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("a", 12);
    map.put("b", 11);
    map.put("c", 3);
     
    for (String key : map.keySet()) {
        System.out.println(map.get(key));
    }

上面代码输出依次是 11   3   12,并非按我们期待的插入顺序 12   11   3 来输出。如果 debug 时可以看到加入到 Hashmap 中的值是较杂乱的放在 Map 的 table 变量/集合中的,应该也是有一定规则的,hashcode 吧,但这一般是不受我们所控的。

我们有时候的要求很简单,就像 List 一样,怎么放进去就怎么拉出来,很多时候这种顺序对于显示或处理也是很重要的,所以就必须找一种排序的 Map,仍然是指保持顺序的 Map。

方案一:
      使用LinkedHashMap()即可,和HashMap()用法一样,不同的是输出结果顺序和插入的顺序一致。

方案二:
在我的 Eclipse 项目里顺着这个思路,ctrl+shift+t,输入 OrderedMap,果然就有了,出自于 org.apache.commons.collections.OrderedMap。这是个接口,进到 commons-collections   的 JavaDoc 界面:http://commons.apache.org/collections/apidocs/index.html,可以看到它的十几个实现子类。

一眼就相中了 ListOrderedMap,就是它了,因而把上面的代码改了:
Map<String, Integer> map = (Map<String, Integer>)new ListOrderedMap();
    map.put("a", 12);
    map.put("b", 11);
    map.put("c", 3);
     
    for (String key : map.keySet()) {
        System.out.println(map.get(key));
    }

这一回乖乖,输出了 12   11  3 的顺序,可以多放些数据到这个 Map 中看看。我试过多次,没问题的,怎么顺序进什么顺序出来。你想要插入一个重复的键值呢,和其他 Map 是一样的,重复的 Key 加不进去。

你想用其他的 OrderedMap 实现类也无妨。稍有不足之处,当前的 commons-collections 3.2.1 尚不支持泛型,强型转一下了。

另一种方案:commons-collections 中还提供了 KeyValue 接口,有相应的多个实现类,如使用其中一个 DefaultKeyValue,把它放入 List 中也可做到 OrderedMap 那样的效果,稍稍麻烦了些。

分享到:
评论

相关推荐

    对于java map类排序

    接下来,我们遍历排序后的键数组,将其与对应的值一起放入新的`TreeMap`中。最后,通过调用`tailMap(result.firstKey())`,我们确保返回的映射包含了所有键值对,从第一个键开始,一直到Map的末尾。 在`main`方法中...

    HashMap,HashTable,LinkedHashMap,TreeMap的区别

    TreeMap 是一种排序的 Map 实现类,它可以对放入里面的键和值进行排序。TreeMap 是基于红黑树的数据结构,具有良好的性能和可扩展性。TreeMap 不允许键或值为 Null。 比较 在选择 Map 实现类时,需要考虑以下几个...

    Java Builder模式构建MAP的示例

    - 最关键的是`map`方法,它接受键值对作为参数,将其放入`map`中,并返回`Builder`自身,这样可以链式调用来添加多个键值对。 - `build`方法用于构建完整的`MapBuilder`对象,将`Builder`实例传递给`MapBuilder`的...

    HashMap排序

    - 使用`TreeMap`:创建一个`TreeMap`对象并传入`ByValueComparator`作为构造函数参数,然后将`HashMap`的所有键值对放入`TreeMap`中。 - 使用`Collections.sort()`:创建一个包含所有键的`ArrayList`,然后调用`...

    core java 学习笔记

    - putAll(Map mapping):将另一个Map的所有键值对放入当前Map。 - clear():清空Map。 - get(Object key):根据键获取值。 - containsKey(Object key):检查Map是否包含指定键。 - containsValue(Object value):...

    springMVC poi解析ajax上传excel文件,返回json对象\list数组

    将每行数据放入List[]&gt; list = new Array List[]&gt;(),并根据excel数据类型将器转换为字符串、数字、Boolean、公式、空值类型防止出现错误,最后返回一个list. 2. ExcelUtil.java工具类 解析通过MutilpartFile导入的...

    EDA习题.docx

    9. **函数的组成**:函数分为函数首(FUNCTION HEAD)和函数体(FUNCTION BODY),在调用前需将它们放入程序包(PACKAGE)。 10. **元件例化**:元件例化是将预设计的实体作为模块实例化到当前设计中,通过PORT MAP...

    汇编指令及说明举例

    5. **POP**:弹栈指令,用于从堆栈中取出数据并将其放入指定的寄存器或内存位置。 - 示例:`POP AX` 从堆栈顶部取出数据,并将其放入AX寄存器。 6. **PUSHA**:压栈指令,用于将一组寄存器的数据压入堆栈。 - ...

    2021-2022计算机二级等级考试试题及答案No.11394.docx

    8. C语言程序段会按顺序输出字符串中的字符,直到遇到空字符为止,所以输出结果是"Aceg"。 9. Internet(因特网)提供的服务包括电子邮件、文件传输和远程登录,不包括实时监测控制。 10. 循环语句的执行次数取决...

    mapreduce运行过程(个人见解如有错误希望大神指导).pdf

    每个切片对应一个maptask实例,然后将任务放入任务队列中。 10. MrAppMaster向各个容器发送程序启动脚本,并在容器上启动map任务。如果maptask失败,则重新申请一个新的maptask实例去处理切片。InputFormat会将文本...

    java大数据内容_5Mapreduce、数据挖掘

    2. **Reduce阶段**:将key下的value去重,最简单的办法就是取出来放入一个set中统计个数量,然后输出。 --- ##### 1.1.2 网站连续几日UV量统计 **需求** 统计网站连续几日内的每日唯一访问者(Unique Visitors,...

    进入华为必备的面试题(5.12)

    在 Java 中,基本类型(如 `int`)是按值传递,而对象(如 `String` 和 `StringBuffer`)是按引用传递。因此,`setInt` 方法中的 `a = 1` 并不会改变外部 `a` 的值;`setString` 方法中的 `str = "1"` 也不会改变...

    程序设计实习(田永鸿)清华大学

    - **选项A** 正确:当把一个对象放入STL容器中时,默认情况下放入的是该对象的一个拷贝。 - **选项B** 错误:一般不会直接放入对象的指针。 - **选项C** 错误:不会直接放入引用,因为容器通常需要拥有元素的所有权...

    Java面试笔试题目.docx

    C选项允许将null键值对放入HashMap。D选项是错误的,因为Map不支持直接的元素插入。正确的是C:new java.util.HashMap().put( null , null )。 以上是对Java面试笔试题目的详细解析,涵盖了Java语言的基础知识,...

    stm32的adxl345寄存器版本

    - 对于写操作,将要设置的值放入数据总线并发送。 - 对于读操作,发送读命令后接收返回的数据。 在“实验29 三轴加速度传感器实验”中,可能包含的是一个实际操作示例,演示如何设置和读取ADXL345的寄存器,以获取...

    基于遗传算法优化极限学习机(GA-ELM)的数据分类预测 matlab代码 这段代码主要是一个基于ELM(Extreme Le

    然后,代码对数据集进行了划分,将不同类别的样本分别放入训练集和测试集中。 接着,代码对数据进行了转置,将输入和输出的维度调整为合适的形状。 然后,代码对数据进行了归一化处理,使用了map

    2021-2022计算机二级等级考试试题及答案No.3948.docx

    默认情况下,Windows系统会将删除的文件放入回收站,但在某些情况下(如彻底删除操作),文件将直接被永久删除。 ### 29. CPU的主频 计算机的主频指的是CPU的时钟频率,它的计量单位是**MHz**(选项正确)。主频是...

    《数据结构》课程设计--最小生成树问题.doc

    在每个程序模块中通过字节流StreamReader从文件中读取字符,放入程序定义的存储结构中。 在城市介绍部分,地图所含城市的主要介绍和城市名存入文本文件c5.txt中,在Map.cs中定义选定城市的关键字T,读取文件中的...

    数据结构中拓扑排序的c++实现

    所有入度为0的节点放入第一个队列。 3. **拓扑遍历**: 当第一个队列非空时,进行以下操作: - 取出队首元素,将其添加到排序结果队列中。 - 更新与该节点相邻节点的入度,若其入度减至0,则将其加入到入度为0的...

Global site tag (gtag.js) - Google Analytics