Java 中的 HashMap 深拷贝
Deep Copy of HashMap in Java
我在制作 HashMap 的深层副本时遇到困难。
我从 尝试了下面的代码,但是 List.copyOf 处的列表给我一个错误(无法解析符号 'List'),我不确定用什么替换它。如果有任何其他方法来制作HashMap的深拷贝,我很想听听。
private HashMap<Character, ArrayList<int[]>> board;
public Vertex(HashMap<Character, ArrayList<int[]>> inputboard) {
board = new HashMap<>();
this.board = copy(inputboard);
}
public HashMap<Character, ArrayList<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {
HashMap<Character, ArrayList<int[]>> copy = original.entrySet().stream()
.collect(Collectors.toMap(e -> e.getKey(), e -> List.copyOf(e.getValue())));
return copy;
}
在我使用上面的代码之前,我也从尝试过这个但是它没有进行深度复制
private HashMap<Character, ArrayList<int[]>> board;
public Vertex(HashMap<Character, ArrayList<int[]>> inputboard) {
board = new HashMap<>();
this.board = copy(inputboard);
}
public HashMap<Character, ArrayList<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {
HashMap<Character, ArrayList<int[]>> copy = new HashMap<>();
for (Map.Entry<Character, ArrayList<int[]>> entry : original.entrySet()) {
copy.put(entry.getKey(), new ArrayList<>(entry.getValue()));
}
return copy;
}
您展示的两种方式都没有复制 int[]
,即没有复制到您想要的深度。
第一种方法实际上 return 是 Map<Character, List<int[]>>
而不是您想要的 HashMap<Character, ArrayList<int[]>>
。我建议您 program to interfaces 并将您的方法更改为 return a Map<Character, List<int[]>>
,然后您可以使用这样的流:
public Map<Character, List<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {
Map<Character, List<int[]>> copy = original.entrySet().stream()
.collect(Collectors.toMap(
Entry::getKey,
e -> e.getValue().stream().map(x -> Arrays.copyOf(x, x.length)).collect(Collectors.toList())
));
return copy;
}
如果您真的不想更改 return 类型,则必须传递更多参数来指定您想要的具体类型:
public HashMap<Character, ArrayList<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {
HashMap<Character, ArrayList<int[]>> copy = original.entrySet().stream()
.collect(Collectors.toMap(
Entry::getKey,
e -> e.getValue().stream().map(x -> Arrays.copyOf(x, x.length)).collect(Collectors.toCollection(ArrayList::new)),
(x, y) -> x,
HashMap::new
));
return copy;
}
否则,您可以使用传统的 for 循环:
public HashMap<Character, ArrayList<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {
HashMap<Character, ArrayList<int[]>> copy = new HashMap<>();
for (Map.Entry<Character, ArrayList<int[]>> entry : original.entrySet()) {
ArrayList<int[]> listCopy = new ArrayList<>();
for (int[] array: entry.getValue()) {
listCopy.add(Arrays.copyOf(array, array.length));
}
copy.put(entry.getKey(), listCopy);
}
return copy;
}
请注意,在所有三个代码片段中,我都使用 Arrays.copyOf
复制 int[]
。
我在制作 HashMap 的深层副本时遇到困难。
我从
private HashMap<Character, ArrayList<int[]>> board;
public Vertex(HashMap<Character, ArrayList<int[]>> inputboard) {
board = new HashMap<>();
this.board = copy(inputboard);
}
public HashMap<Character, ArrayList<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {
HashMap<Character, ArrayList<int[]>> copy = original.entrySet().stream()
.collect(Collectors.toMap(e -> e.getKey(), e -> List.copyOf(e.getValue())));
return copy;
}
在我使用上面的代码之前,我也从
private HashMap<Character, ArrayList<int[]>> board;
public Vertex(HashMap<Character, ArrayList<int[]>> inputboard) {
board = new HashMap<>();
this.board = copy(inputboard);
}
public HashMap<Character, ArrayList<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {
HashMap<Character, ArrayList<int[]>> copy = new HashMap<>();
for (Map.Entry<Character, ArrayList<int[]>> entry : original.entrySet()) {
copy.put(entry.getKey(), new ArrayList<>(entry.getValue()));
}
return copy;
}
您展示的两种方式都没有复制 int[]
,即没有复制到您想要的深度。
第一种方法实际上 return 是 Map<Character, List<int[]>>
而不是您想要的 HashMap<Character, ArrayList<int[]>>
。我建议您 program to interfaces 并将您的方法更改为 return a Map<Character, List<int[]>>
,然后您可以使用这样的流:
public Map<Character, List<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {
Map<Character, List<int[]>> copy = original.entrySet().stream()
.collect(Collectors.toMap(
Entry::getKey,
e -> e.getValue().stream().map(x -> Arrays.copyOf(x, x.length)).collect(Collectors.toList())
));
return copy;
}
如果您真的不想更改 return 类型,则必须传递更多参数来指定您想要的具体类型:
public HashMap<Character, ArrayList<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {
HashMap<Character, ArrayList<int[]>> copy = original.entrySet().stream()
.collect(Collectors.toMap(
Entry::getKey,
e -> e.getValue().stream().map(x -> Arrays.copyOf(x, x.length)).collect(Collectors.toCollection(ArrayList::new)),
(x, y) -> x,
HashMap::new
));
return copy;
}
否则,您可以使用传统的 for 循环:
public HashMap<Character, ArrayList<int[]>> copy (HashMap<Character, ArrayList<int[]>> original) {
HashMap<Character, ArrayList<int[]>> copy = new HashMap<>();
for (Map.Entry<Character, ArrayList<int[]>> entry : original.entrySet()) {
ArrayList<int[]> listCopy = new ArrayList<>();
for (int[] array: entry.getValue()) {
listCopy.add(Arrays.copyOf(array, array.length));
}
copy.put(entry.getKey(), listCopy);
}
return copy;
}
请注意,在所有三个代码片段中,我都使用 Arrays.copyOf
复制 int[]
。