在使用 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 那样的效果,稍稍麻烦了些。
分享到:
相关推荐
接下来,我们遍历排序后的键数组,将其与对应的值一起放入新的`TreeMap`中。最后,通过调用`tailMap(result.firstKey())`,我们确保返回的映射包含了所有键值对,从第一个键开始,一直到Map的末尾。 在`main`方法中...
TreeMap 是一种排序的 Map 实现类,它可以对放入里面的键和值进行排序。TreeMap 是基于红黑树的数据结构,具有良好的性能和可扩展性。TreeMap 不允许键或值为 Null。 比较 在选择 Map 实现类时,需要考虑以下几个...
- 最关键的是`map`方法,它接受键值对作为参数,将其放入`map`中,并返回`Builder`自身,这样可以链式调用来添加多个键值对。 - `build`方法用于构建完整的`MapBuilder`对象,将`Builder`实例传递给`MapBuilder`的...
- 使用`TreeMap`:创建一个`TreeMap`对象并传入`ByValueComparator`作为构造函数参数,然后将`HashMap`的所有键值对放入`TreeMap`中。 - 使用`Collections.sort()`:创建一个包含所有键的`ArrayList`,然后调用`...
- putAll(Map mapping):将另一个Map的所有键值对放入当前Map。 - clear():清空Map。 - get(Object key):根据键获取值。 - containsKey(Object key):检查Map是否包含指定键。 - containsValue(Object value):...
将每行数据放入List[]> list = new Array List[]>(),并根据excel数据类型将器转换为字符串、数字、Boolean、公式、空值类型防止出现错误,最后返回一个list. 2. ExcelUtil.java工具类 解析通过MutilpartFile导入的...
9. **函数的组成**:函数分为函数首(FUNCTION HEAD)和函数体(FUNCTION BODY),在调用前需将它们放入程序包(PACKAGE)。 10. **元件例化**:元件例化是将预设计的实体作为模块实例化到当前设计中,通过PORT MAP...
5. **POP**:弹栈指令,用于从堆栈中取出数据并将其放入指定的寄存器或内存位置。 - 示例:`POP AX` 从堆栈顶部取出数据,并将其放入AX寄存器。 6. **PUSHA**:压栈指令,用于将一组寄存器的数据压入堆栈。 - ...
8. C语言程序段会按顺序输出字符串中的字符,直到遇到空字符为止,所以输出结果是"Aceg"。 9. Internet(因特网)提供的服务包括电子邮件、文件传输和远程登录,不包括实时监测控制。 10. 循环语句的执行次数取决...
每个切片对应一个maptask实例,然后将任务放入任务队列中。 10. MrAppMaster向各个容器发送程序启动脚本,并在容器上启动map任务。如果maptask失败,则重新申请一个新的maptask实例去处理切片。InputFormat会将文本...
2. **Reduce阶段**:将key下的value去重,最简单的办法就是取出来放入一个set中统计个数量,然后输出。 --- ##### 1.1.2 网站连续几日UV量统计 **需求** 统计网站连续几日内的每日唯一访问者(Unique Visitors,...
在 Java 中,基本类型(如 `int`)是按值传递,而对象(如 `String` 和 `StringBuffer`)是按引用传递。因此,`setInt` 方法中的 `a = 1` 并不会改变外部 `a` 的值;`setString` 方法中的 `str = "1"` 也不会改变...
- **选项A** 正确:当把一个对象放入STL容器中时,默认情况下放入的是该对象的一个拷贝。 - **选项B** 错误:一般不会直接放入对象的指针。 - **选项C** 错误:不会直接放入引用,因为容器通常需要拥有元素的所有权...
C选项允许将null键值对放入HashMap。D选项是错误的,因为Map不支持直接的元素插入。正确的是C:new java.util.HashMap().put( null , null )。 以上是对Java面试笔试题目的详细解析,涵盖了Java语言的基础知识,...
- 对于写操作,将要设置的值放入数据总线并发送。 - 对于读操作,发送读命令后接收返回的数据。 在“实验29 三轴加速度传感器实验”中,可能包含的是一个实际操作示例,演示如何设置和读取ADXL345的寄存器,以获取...
然后,代码对数据集进行了划分,将不同类别的样本分别放入训练集和测试集中。 接着,代码对数据进行了转置,将输入和输出的维度调整为合适的形状。 然后,代码对数据进行了归一化处理,使用了map
默认情况下,Windows系统会将删除的文件放入回收站,但在某些情况下(如彻底删除操作),文件将直接被永久删除。 ### 29. CPU的主频 计算机的主频指的是CPU的时钟频率,它的计量单位是**MHz**(选项正确)。主频是...
在每个程序模块中通过字节流StreamReader从文件中读取字符,放入程序定义的存储结构中。 在城市介绍部分,地图所含城市的主要介绍和城市名存入文本文件c5.txt中,在Map.cs中定义选定城市的关键字T,读取文件中的...
所有入度为0的节点放入第一个队列。 3. **拓扑遍历**: 当第一个队列非空时,进行以下操作: - 取出队首元素,将其添加到排序结果队列中。 - 更新与该节点相邻节点的入度,若其入度减至0,则将其加入到入度为0的...