【问题标题】:How to code the set method of a Map with another Map as value?如何使用另一个 Map 作为值对 Map 的 set 方法进行编码?
【发布时间】:2010-05-27 20:06:07
【问题描述】:

我通常这样做是为了将新 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(及其所有元素)的新副本,而不仅仅是复制参考。

【问题讨论】:

  • 您是否也需要克隆Clausula 对象,或者您可以只使用旧对象,只复制地图?
  • 我也需要复制 Clausula 对象,但这些对象已被处理,无需担心 :)

标签: java reference map copy


【解决方案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;
}

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

【讨论】:

  • 我需要使用手动方法,但我无法使用任何这些解决方案。那么对于这种特定情况,我该怎么做呢?
  • 在这种特殊情况下通配符是什么?
  • Map 不是 Map 的子类型,因此您需要通配符。试试看,你就会明白我的意思了。
  • 刚刚做了,我无法发现任何编译器错误或异常...根据您的建议,这是我的完整代码:pastebin.org/286794
  • 有一个小的区别,上面,地图是 TreeMap() - 在你的代码中它是 Map>,所以你不要不需要通配符。我保留了 TreeMap,因为我认为您的实现需要它。如果更清楚,我可以更新代码以使用 Map,而不是 TreeMap。
【解决方案2】:

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

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;
}

【讨论】:

    猜你喜欢
    • 2014-07-22
    • 2021-12-11
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多