复制列表,而不是多次链接到原始列表! java的

时间:2018-04-05 09:19:17

标签: java arraylist hashmap

我在复制ArrayLists以将它们放入Hashmap时遇到问题。我有一个填充了潜在资源的ArrayList。我需要为他们添加一个时间维度,我通过使用HashMap实现:

HashMap<Integer, ArrayList<Resource>> resourceTime = new HashMap<>();

现在我希望每个时间戳t具有完全相同的ArrayList<Resource>。这将在稍后的程序中进行修改。现在的问题是,如果我用相同的原始ArrayList填充hashMap,它将保持链接到此列表。如果我修改HashMap的时间戳t,它将针对每个时间戳t进行修改。

代码:

ArrayList<Resource> resourceUsageList = new ArrayList<>();
HashMap<Integer, ArrayList<Resource>> resourceUsage = new HashMap<>();

//The resourcearraylist gets filled with items or resources.

resourceUsageList.add(usage);

 for(int t = 0; t < TIME; t++){

   resourceUsage.put(t, resourceUsageList);
}

有没有什么方法可以用相同的ArrayList填充每个时间戳t而不用它们链接?

2 个答案:

答案 0 :(得分:2)

您可以创建列表的副本并将副本放入地图中。这可以使用ArrayList copy constructor来完成,例如:

resourceUsage.put(t, new ArrayList<>(resourceUsageList));

但请注意,列表项仍然在列表之间“共享”,即如果列表中包含的Resource个实例被修改,则可能会影响多个列表。 如果Resource是不可变的或实际上从未修改过,这不是问题。否则,您还需要克隆资源。

答案 1 :(得分:0)

初始化一个ArrayList并为每个时间戳克隆它。您可以使用org.apache.commons.lang.ObjectUtils中的ObjectUtils。

for(int t = 0; t < TIME; t++){
    resourceUsage.put(t, (ArrayList)ObjectUtils.clone(resourceUsageList)); 
}
相关问题