返回信息流rt,现在在实现一个带泛型的二叉树,在实现其的深拷贝时不知道怎么做。。。
这是一条镜像帖。来源:北邮人论坛 / java / #45216同步于 2015/11/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
泛型对象怎么做到深拷贝?
flymyheart
2015/11/4镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
刚找了一下,貌似没看到阿,有链接么?
这个问题关键是拷贝泛型对象。
【 在 lixing 的大作中提到: 】
: leetcode有这道题。好像记得有一种方法是通过一个hashmap保存节点的关系,然后复制。
就拷贝就行了,范型其实不是问题。
package cn.byr.nuanyangyang.genbst;
class Node<T> {
public T data;
public Node<T> left, right;
public Node(T data, Node<T> left, Node<T> right) {
this.data = data;
this.left = left;
this.right = right;
}
public Node<T> copy() {
Node<T> c = new Node<T>(data, left == null ? null : left.copy(), right == null ? null : right.copy());
return c;
}
@Override
public String toString() {
return (left == null ? "" : left.toString()) + data + (right == null ? "" : right.toString());
}
}
public class GenBstTest {
public static void main(String[] args) {
Node<Integer> foo = new Node<>(2, new Node<>(1, null, null), new Node<>(4, new Node<>(3, null, null), null));
Node<Integer> bar = foo.copy();
System.out.println(bar.toString());
}
}
但这个程序深拷贝整棵树,但并不拷贝data本身。新的树每个节点指向和旧树对应节点相同的T。
如果你想拷贝T数据本身……做不到。不是所有的对象都可以拷贝的。比如InputStream。拷贝了会出问题的。
做不到阿。。
现在需要同时动态打印出原二叉树和修改后的二叉树,所以想深拷贝data本身。
【 在 nuanyangyang 的大作中提到: 】
: 就拷贝就行了,范型其实不是问题。
: [code=java]
: package cn.byr.nuanyangyang.genbst;
: ...................
【 在 flymyheart 的大作中提到: 】
: 刚找了一下,貌似没看到阿,有链接么?
: 这个问题关键是拷贝泛型对象。
我说的是这道题
https://leetcode.com/problems/clone-graph/
不过看了下好像并不太一样
【 在 flymyheart 的大作中提到: 】
: 做不到阿。。
: 现在需要同时动态打印出原二叉树和修改后的二叉树,所以想深拷贝data本身。
真做不到。
有些对象内部会保存一些状态。比如Socket,它创建的时候打开一个系统的socket,它close的时候把那个socket关掉。而它内部存的状态只是那个file descriptor,也就是一个int而已。虽然你可以“深拷贝”这个socket,但是socket要关掉的话就已经关掉了。
如果T可以拷贝,不妨让它实现Cloneable接口。
ok,谢暖神了~
【 在 nuanyangyang 的大作中提到: 】
:
: 真做不到。
: 有些对象内部会保存一些状态。比如Socket,它创建的时候打开一个系统的socket,它close的时候把那个socket关掉。而它内部存的状态只是那个file descriptor,也就是一个int而已。虽然你可以“深拷贝”这个socket,但是socket要关掉的话就已经关掉了。
: ...................