当前位置: 首页 > 知识库问答 >
问题:

克隆列表地图的有效方法?

王磊
2023-03-14

对于我的项目,我需要一种类型的字典,在那里我可以按键访问值列表,但也可以按值获取键。为了实现这一点,我创建了一个包含两个HashMaps的新类:

private final Map<K, List<V>> kvMap;
private final Map<V, K> vkMap;

我也想能够克隆这种地图。我目前的解决方案是

public InverseSurjectiveMap(InverseSurjectiveMap<K, V> map) {
    this.kvMap = new HashMap<>(map.kvMap);

    for (K key : map.kvMap.keySet()) {
        kvMap.put(key, new LinkedList<>(kvMap.get(key)));
    }

    this.vkMap = new HashMap<>(map.vkMap);
}

是否有一种更节省时间的方法来执行此复制:减少时间复杂度,而不是内存复杂度。谢了!

编辑:我需要的是,改变初始地图的列表不会改变复制地图的列表,反之亦然。我希望实际元素引用相同的实例。

共有1个答案

陈茂
2023-03-14

可以使用Map的replaceAll方法:

this.kvMap = new HashMap<>(map.kvMap);
this.kvMap.replaceAll((k, v) -> new ArrayList<>(v));

正如markspace所指出的,这将克隆列表,但是如果您的键和值本身是可变的,那么它们必须单独克隆,以便您的地图成为完整的克隆。

 类似资料:
  • 来自Java背景:“克隆”省道、和的推荐方法是什么?

  • 如果我克隆了以下类的一个实例,并在实例化时覆盖了一个方法,克隆会有被覆盖的方法吗?我在https://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html和https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone()中没有找到任何关于这种行为的内容。

  • 主要内容:示例在某些情况下,您可能需要一个表的完整、精确副本,也即克隆表(复制表)。我们首先想到的是使用 CREATE TABLE 命令创建一张新表,然后使用 SELECT 命令从旧表中选取所有数据,并使用 INSERT 命令插入到新表中。但是这种做法可能达不到您的目的,因为副本必须包含相同的索引、约束、默认值等。 如果您使用 MySQL 数据库,可以借助 SHOW CREATE TABLE 命令,该命令用来展

  • void cloneTable(String srcName, String destTable, boolean flushTable) 功能 克隆已存在的表,具有相同的TableSpec和表数据 方法参数 1.srcName : String : required 克隆的源表的表名 2.destTable : String : required 克隆的目标表的表名 3.flushTable :

  • 问题内容: 我正在尝试制作对象(包括实例)的深层副本。我一直很警惕使用它,在这里似乎并没有覆盖它,所以我只是逐字段进行复制。理想情况下,会有一个复制构造函数,我可以这样使用: 不幸的是,我在API中找不到任何这样的功能,并且一直试图找出我需要获得确切副本的字段。因此,要复制这些日历之一,您将如何做?我在这里缺少一些简单的捷径吗? 问题答案: 已覆盖正在运行的内容,请使用它。此外,它没有深层的数据层

  • 本文向大家介绍VMware虚拟机克隆的方法,包括了VMware虚拟机克隆的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了VMware虚拟机克隆的具体步骤,供大家参考,具体内容如下 一、环境 VMware 14 克隆系统CentOS6.8 二、开始克隆 被克隆系统处于关机状态,选择 虚拟机 > 管理 > 克隆 > 下一步 > 下一步(选择从当前状态虚拟机克隆或已有快照克隆)> 创