java - 如何编写一个Map的set方法并将另一个Map作为值?

标签 java reference dictionary copy

我通常这样做是为了将新的 Map 设置为私有(private)变量:

public static void setListaClausulas(Map<String, Clausula> nvLista) {
    listaClausulas = new TreeMap<String, Clausula>(nvLista);
}

我认为设置 nvLista 及其所有成员的新副本(而不是引用)是可以的,是吗?

但现在我在另一个 map 中有一个 map ,我正在这样做:

public static void setListaClausulas(Map<String, Map<String, Clausula>> nvLista) {
    listaClausulas = new TreeMap<String, Map<String, Clausula>>(nvLista);
}

这是正确的方法还是您推荐其他方法?我想要的是设置 nvLista (及其所有元素)的新副本,而不是仅复制引用。

最佳答案

我猜您担心在方法参数中传递的映射会发生变化?

您需要创建参数的深拷贝。这个问题中讨论了各种方法,deep-clone-utility-recomendation

编辑:为了回应评论,这里有一个编码版本。这不会深度复制 Clausula 实例,因为它们之前没有被复制 - 我假设它们是不可变的。

public Map<String, Map<String, Clausula>> deepCopy(Map<String, Map<String, Clausula>> nvLista)
{
   Map<String, Map<String, Clausula>> target = new TreeMap<String, Map<String, Clausula>>();
   for (String key: nvLista.keySet()) {
       Map<String, Clausula> value = nvLista.get(key);
       target.put(key, new TreeMap<String,Clausula>(value));
   }
   return target;
}

但是,像这样的嵌套集合类型很快就会变得不可读。如果您可以更改代码,则可能有助于为最里面的映射创建包装器对象的可读性。

关于java - 如何编写一个Map的set方法并将另一个Map作为值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2924486/

相关文章:

java - 是否可以在应用程序中捆绑 kext?

java - Android:对 findViewById 的引用

c++ - 将左值引用绑定(bind)到右值引用?

python - 将两个字典的值相乘,同时在 Python 中附加键

java - Android 谷歌地图 API 无法正常工作

java - JodaTime 字符串 yyyy-mm-ddThh :mmss. Z 到日期时间

java - 访问rest资源时出现404错误

java - 在 Haxe 正则表达式中是否有等同于 Java 的\p{Punct} 的东西?

php - PHP编程语言中 'identifier'和 'reference'概念有什么区别?

java - 为什么我的 Java Map 无法在 IntelliJ 中编译?