gpt4 book ai didi

Java:LinkedHashMap 自身重叠

转载 作者:行者123 更新时间:2023-12-01 12:10:12 25 4
gpt4 key购买 nike

我想创建链接 HashMap 的副本,然后我想删除所有值(从列表中)而不是第一个条目。这是我得到的:

LinkedHashMap<String, List<Value>> facetsInCategoriesCopy = new LinkedHashMap<>(facetsInCategories);

if (!facets.equals("something")) {
for (List<Value> value : facetsInCategoriesCopy.values()) {
if (value.size() > 1) {
int nbrOfElements = value.size();
for (int i = nbrOfElements-1; i > 0; i--) {
value.remove(i);
}
}
}
}

经过此操作,facetsInCategories 也被修改了。为什么?以及如何解决这个问题?任何帮助将不胜感激。

最佳答案

我没有 50 点声誉来添加评论。请参阅此答案 Assigning Hashmap to Hashmap

本质上,用于创建新映射的复制构造函数引用了可变对象,即 facetsInCategories,并且在您更新 facetsInCategoriesCopy 映射时也会更新该对象。

解决方案是进行深层复制。我在下面添加了测试代码,我使用 String 而不是 Value

  //Test for https://stackoverflow.com/questions/27324315/
public static void testStackO_Q_27324315() {

Map<String, List<String>> facetsInCategories = new LinkedHashMap<String, List<String>>();
String[] values = new String[]{"Test1", "Test2", "Test3"};
List<String> valuesList = new ArrayList<String>(Arrays.asList(values));
facetsInCategories.put("Test", valuesList);

Map temp = Collections.unmodifiableMap(facetsInCategories);
LinkedHashMap<String, List<String>> facetsInCategoriesCopy = (LinkedHashMap<String, List<String>>)deepCopy(temp);

String facets = "test_me";

if (!facets.equals("something")) {
for (List<String> value : facetsInCategoriesCopy.values()) {
if (value.size() > 1) {
int nbrOfElements = value.size();
for (int i = nbrOfElements-1; i > 0; i--) {
value.remove(i);
}
}
}
}

System.out.println(facetsInCategories);
System.out.println(facetsInCategoriesCopy);
}

public static <K1, K2, V> Map<K1, List<V>> deepCopy(
Map<K1, List<V>> original){

Map<K1, List<V>> copy = new LinkedHashMap<K1, List<V>>();
for(Map.Entry<K1, List<V>> entry : original.entrySet()){
copy.put(entry.getKey(), new ArrayList<V>(entry.getValue()));
}
return copy;
}

关于Java:LinkedHashMap 自身重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27324315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com