我正在开发一个树结构,它应该保证每个父节点只包含唯一的节点集。这是我的代码:
public class TreeNode implements Iterable<TreeNode> {
private final TreeNode parent;
private final List<TreeNode> children = new LinkedList<>();
public TreeNode(TreeNode parent) {
this.parent = parent;
}
public TreeNode append(TreeNode child) {
int index = children.indexOf(child);
if (index < 0) {
children.add(child);
return child;
} else {
return children.get(index);
}
}
public Iterator<TreeNode> iterator() {
return children.iterator();
}
/* Other unimportant application details */
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TreeNode t = (TreeNode) o;
return parent != null ? parent.equals(t.parent) : t.parent == null;
}
public int hashCode() {
return parent != null ? parent.hashCode() : 0;
}
}
这里的问题是,如果我的树很深,每个children.indexOf()
调用将以递归方式检查每个append
方法调用中的所有父项是否相等。我想重新实现equals()
和hashCode()
方法,它们只会检查同一级别上每个节点的完全父级是否相同。像这样:
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TreeNode t = (TreeNode) o;
return parent == t.parent;
}
public int hashCode() {
return System.identityHashCode(parent);
}
我想不出这可能成为问题的原因。你看到这个实现有什么问题吗?如果是这样,你能为这个问题提出更好的解决方案吗?
答案 0 :(得分:0)
“应该保证每个父节点只包含唯一的节点集。”
根据我的意见, private final List children = new LinkedList&lt;&gt;();
如果您对将孩子定义为List有任何其他想法,请与我们分享。