我创建了一个类Foo,该类具有返回Array的方法toArray()。

现在,我有一个将字符串映射到HashMaps的HashMap,后者将对象映射到Foo。那是:

HashMap>

我想创建一个新的类型的对象:

HashMap>>

这是通过为原始HashMAp中的每个元素Foo调用函数toArray()获得的。

为此,我通常会执行以下操作:

public static HashMap>> changeMap(Map mpOld) {

Object key2;

String key1;

Iterator it2;

HashMap>> mpNew=

new HashMap>>()

Iterator it1 = mpOld.keySet().iterator();

while (it1.hasNext()) {

key1=it1.next();

it2= mpOld.get(key1).keySet().iterator();

mpNew.put(key1,new HashMap>())

while (it2.hasNext()) {

key2=it2.next();

mpNew.get(key1).put(key2,mpOld.get(key1).get(key2).toArray());

//TODO clear entry mpOld.get(key1).get(key2)

}

//TODO clear entry mpOld.get(key1)

}

return mpNew;

}

类似的代码也可以,但是HashMap的大小太大,无法将其中的两个保存在内存中。如您所见,我在要清除某些条目的地方添加了两点。问题是,如果这样做,我会遇到并发错误,或者迭代器循环刚刚终止。

我想知道是否有更好的方法来遍历地图并复制信息。

另外,我正在一个Scala项目中工作,但是在这里我必须使用Java类型解决一些兼容性问题。尽管Java.util.HashMap不是迭代器,但Scala可能具有一些隐藏的功能来处理此问题?

谢谢,

迭代器提供了remove(..)方法,可以安全地删除以前访问的项目。遍历地图的键/值条目,将其转换并将其添加到新的地图中,并在使用时删除旧的。

/**

* Transfers and converts all entries from map1 to

* map2.  Specifically, the {@link Foo} objects of the

* inner maps will be converted to integer arrays via {@link Foo#toArray}.

*

* @param map1 Map to be emptied.

* @param map2 Receptacle for the converted entries.

*/

private static void transfer(Map> map1

, Map> map2) {

final Iterator>> mapIt

= map1.entrySet().iterator();

while (mapIt.hasNext()) {

final Entry> mapEntry = mapIt.next();

mapIt.remove();

final Map submap = new HashMap();

map2.put(mapEntry.getKey(), submap);

final Iterator> fooIt

= mapEntry.getValue().entrySet().iterator();

while (fooIt.hasNext()) {

final Entry fooEntry = fooIt.next();

fooIt.remove();

submap.put(fooEntry.getKey(), fooEntry.getValue().toArray());

}

}

}

我没有时间检查它,但是我猜类似的事情应该可以在scala Maps上工作(假设您使用的scala 2.8终于在这里了):

mpO.mapValues(_.mapValues(_.toArray))

它将使用您的外部映射,并用新的内部映射"替换"所有内部映射,其中值是Int数组。键和地图的一般"结构"保持不变。根据scaladoc的说法,"生成的地图将包裹原始地图,而不会复制任何元素。",因此它不会真正替代。

如果您还做一个

import scala.collection.JavaConversions._

那么可以使用与Scala映射相同的方式使用Java映射:JavaConversions包含一堆可以在scala和Java集合之间转换的隐式方法。

BTW最后使用Map >>可能并不真正方便,如果我是我,我会考虑引入一些隐藏此构造复杂性的类。

编辑以反映您的评论

import scala.collection.JavaConversions._

import java.util.Collections._

object MapValues {

def main(args: Array[String]) {

val jMap = singletonMap("a",singletonMap("b", 1))

println(jMap)

println(jMap.mapValues(_.mapValues(_+1)))

}

}

打印:

{A = {B = 1}}

地图(a->地图(b-> 2))

表明隐式函数很好地应用于了外部和内部映射。这是JavaConversions对象的目的:即使您有Java集合,也可以将其用作类似的scala类(具有增强的功能)。

您无需执行其他任何操作,只需导入JavaConversions。_

谢谢,但是尽管我在项目中使用Scala,但HashMaps是Java HashMaps,因此您不能在它们上调用mapVAlues。 这是使用JavaConversions解决此问题的一种方法吗?

您能解决您的问题吗? 我的编辑有帮助吗?

例如考虑字符串键;让我们调用输入数据:Map> data

for (Entry> entry : data.entrySet()) {

String itemKey = entry.getKey();

for (Entry innerEntry : entry.getValue().entrySet()) {

String innerKey = innerEntry.getKey();

Object o = innerEntry.getValue();

// whatever, here you have itemKey, innerKey and o

}

}

The set is backed by the map, so changes to the map are reflected in the set, and vice-versa. If the map is modified while an iteration over the set is in progress (except through the iterator's own remove operation), the results of the iteration are undefined. The set supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Set.remove, removeAll, retainAll, and clear operations.

为什么不在迭代器上调用remove ()方法,或者为什么不调用set.remove (iterator.next ()),其中iterator.next ()返回键,则set是键集,并对其迭代器进行迭代。

PS:还要尝试重构您的数据结构,也许是一些处理数据检索的中间类?包含数组作为值的映射中的映射什么也没说,很难跟踪。

java hashmap is遍历_关于内存:在Java(或Scala)中遍历HashMap的HashMap相关推荐

  1. hashmap 遍历_别慌,送你21 个面试官必问HashMap考点

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:菜鸟小于 来源:https://www.cnblogs.com/Young111/p/11519952.html 1:H ...

  2. java 虚拟机的存储_《深入理解java虚拟机》之内存模型与安全

    不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的.其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改.总结jav ...

  3. java 基础 笔试题_非常全面的java基础笔试题

    1.下列说法正确的是() (程序结构) A java程序的main方法必须写在类甩面 B java程序中可以有多个main方法 C.java程序中类名必须与文件名一样 D.JAVA程序的main方法中 ...

  4. java 开发书籍 目录_《零基础 Java 开发 》全书目录

    第1部分 Java开发基础 第一章 搭建Java开发环境 1.1 Java简介 1.2 Java开发环境搭建 1.3 Java语⾔的功能 1.4 使用Eclipse开发Java程序 1.5 使用IDE ...

  5. java class 文件分析_大概优秀的java程序员都要会分析class文件吧

    相信大家在学java的时候都会听到这样的一些结论: enum 是一个类 泛型的实现使用了类型擦除技术 非静态内部类持有外部类的引用 需要将自由变量声明成final才能给匿名内部类访问 ... 初学的时 ...

  6. python面试 hashmap是什么_面试不慌,看完保证让你写HashMap跟玩一样

    作者 | 梁唐 出品 | TechFlow(ID:techflow2019) 头图 | CSDN 下载自东方IC 今天这篇文章给大家讲讲hashmap,这个号称是所有Java工程师都会的数据结构.为什 ...

  7. java list e 查找_源码(04) -- java.util.ListE

    java.util.List 源码分析(JDK1.7) ------------------------------------------------------------------------ ...

  8. 李兴华java视频在线观看_李兴华Java开发实战经典视频教程_IT教程网

    资源名称:李兴华Java开发实战经典视频教程 资源目录: [IT教程网]010201_[第2章:简单Java程序]_简单Java程序 [IT教程网]010301_[第3章:Java基础程序设计]_Ja ...

  9. 李兴华java实战经典视频_李兴华Java开发实战经典视频教程

    资源名称:李兴华Java开发实战经典视频教程 资源目录:[一品资源网]010201_[第2章:简单Java程序]_简单Java程序[一品资源网]010301_[第3章:Java基础程序设计]_Java ...

最新文章

  1. 多个线程为了同个资源打起架来了,该如何让他们安分?
  2. 小女也爱C#(5)---程序员内功心法数据结构(完全平衡二叉树)
  3. Asp.net 点滴
  4. Deep Learning论文笔记之(五)CNN卷积神经网络代码理解
  5. 光脚丫学LINQ(005):数据表之间的联接查询
  6. c#arcgis engine开发_湖南web开发学习网站要多久
  7. js 实现井字棋游戏
  8. 自己动手编写CSDN博客备份工具-blogspider
  9. html 中的版权符号 : 圆圈C
  10. c++中DLL文件的编写与实现——三步走
  11. 如何在Ubuntu MATE 18.04中安装GNOME 3?
  12. 平安科技移动开发二队技术周报(第十期)
  13. 其实,我喜欢你很久了。
  14. 刷脸支付会以迅雷不及掩耳之势布局未来
  15. Leetcode 1196:最多可以买到的苹果数量(超详细的解法!!!)
  16. sublime 使用浏览器不反应
  17. ​治理 V20 领导应如何支持
  18. 思考与总结:对佣金系统的思考
  19. 什么是epub格式,有什么好用的epub阅读器
  20. sqlite3: sqlite3_step 函数

热门文章

  1. JS:关于断点续传插件 Resumable.js 中的文件上传控制问题
  2. LPC11C14刷卡门锁
  3. java文本框的内容改变颜色_关于在java文本框类型组件改变字体颜色
  4. 搭建scrapy框架
  5. 重庆市公需科目快速学习方法
  6. 英语语法思维导图,田静老师的长难句听课笔记
  7. 饥荒服务器身份验证错误,windows 2008/2012/2016/10系统远程连接出现身份验证错误解决办法...
  8. 微前端架构:如何由内而外取代单体架构
  9. Oracle11g导出数据缺表解决方法
  10. 5G LAN赋能智慧工厂加速落地,四信5G工业路由器成最佳助攻