java - 按特定顺序合并两个地图
问题描述
我有两个地图 map1 和 map2。我想按特定顺序组合这两个地图。假设我有两张地图
Map<String, String> map1 = new HashMap<>();
Map<String, String> map2 = new HashMap<>();
map1.put("id1", "3895");
map1.put("id2", "6754");
map1.put("id3", "7896");
map1.put("id4", "1122");
map2.put("month1", "Jan");
map2.put("month2", "Mar");
map2.put("month3", "Dec");
map2.put("month4", "Aug");
现在我想组合这两张地图,以便第三张地图的元素按以下顺序排列。Map3 中的预期顺序。
("id1", "3895")
("month1", "Jan")
("id2", "6754")
("month2", "Mar")
("id3", "7896")
("month3", "Dec")
("id4", "1122")
("month4", "Aug")
我如何实现这一目标?我尝试使用 putAll 和 LinkedHashMap 但结果顺序不是预期的。
使用 LinkedHashMap -
Map<String, String> merged = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new));
结果是
("id1", "3895")
("id2", "6754")
("id3", "7896")
("id4", "1122")
("month1", "Jan")
("month2", "Mar")
("month3", "Dec")
("month4", "Aug")
这不是我的预期。
解决方案
正如@Andreas 所建议的,您可以并行迭代地图并LinkedHashMap
保持秩序,
Map<String, String> result = new LinkedHashMap<>();
Iterator<Map.Entry<String, String>> iter1 = map1.entrySet().iterator();
Iterator<Map.Entry<String, String>> iter2 = map2.entrySet().iterator();
while(iter1.hasNext() || iter2.hasNext()) {
Map.Entry<String, String> e1 = iter1.next();
Map.Entry<String, String> e2 = iter2.next();
result.put(e1.getKey(), e1.getValue());
result.put(e2.getKey(), e2.getValue());
}
如果两个地图的键都像 id1、id2、month1、month2,那么您可以使用Comparator
带数字的自定义进行排序,如下所示,
Comparator<Map.Entry<String, String>> comparator = Comparator.comparing(c -> c.getKey().replaceAll("^\\D+", "")) ;
Map<String, String> collect = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
.sorted(comparator)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,(oldValue, newValue) -> oldValue, LinkedHashMap::new));
推荐阅读
- sql - 如何在不创建临时表的情况下将行转换为 SQL SERVER 中的列
- reactjs - 在 React Reducer 中从 API 调用和存储数据
- c# - 无法在 .NETFramework、Version=v4.6.1 windows 应用程序中安装 SQLite.Interop.dll
- azureservicebus - 使用 MassTransit 在 Azure 服务总线上发布消息时断时续
- clojure - 如何在本地存储中设置和获取向量?
- symfony4 - Webpack Encore 构建失败找不到模块'./if'
- python-3.x - 将 3D 对象与方向矢量对齐
- java - 试图让循环通过备用数组工作
- python - Pandas:在数据框中重建历史,合并有冲突的时间段
- c++ - 在程序中打印单词的计数:“the”时,即使“the”的计数不为零,来自包含句子的 .txt 文件也会给出 count=0