如何使用另一个Map作为值来编写Map的set方法?

时间:2010-05-27 20:06:08

标签: java reference map copy

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

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

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

但是现在我在另一张地图中有一张地图而我正在这样做:

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

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

2 个答案:

答案 0 :(得分:1)

我猜你担心你的方法参数中传递的地图会发生变异吗?

您需要创建参数的深层副本。在这个SO问题中讨论了各种方法,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;
}

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

答案 1 :(得分:0)

对于一般情况,深度复制很难,但您可以这样做来解决您的特定问题:

static Map< String, Map< String, Clausula > > deepCopy (
        final Map< String, Map< String, Clausula > > source
    )
{
    final TreeMap< String, Map< String, Clausula> > result  =
        new TreeMap< String, Map<String,Clausula> >( );

    for (
        final Map.Entry< String, Map< String, Clausula> > cur :
            source.entrySet( )
    )
    {
        result.put(
            cur.getKey( ),
            new TreeMap< String, Clausula >( cur.getValue( ) )
        );
    }

    return result;
}