泛型N叉树中equals方法的实现疑问
解决N叉树
equals方法的递归子节点比较问题 嘿,我来帮你搞定这个N叉树的相等性判断问题!你现在的sameTree方法只检查了数据和节点数量,但确实漏掉了递归遍历子节点数组的关键步骤。下面是一步步的解决方案:
首先要修正的几个关键点
- 不要用
==比较data:对于泛型类型T,==是比较对象引用,而我们需要的是内容相等,所以应该用Objects.equals(this.data, xpto.data)(记得导入java.util.Objects),这样还能处理data为null的情况。 - 子节点数组的比较要分情况:首先判断两个数组的长度是否一致,然后逐个递归比较每个位置的子节点;还要处理其中一个数组为
null的边界情况。
修改后的sameTree和equals方法代码
import java.util.Objects; import java.util.Arrays; public class ArrayNTree<T extends Comparable<T>> implements NTree<T>, Cloneable { /* Data of the tree*/ private T data; /* Primary array to store the children */ private ArrayNTree<T>[] children; private int size; // 假设你的size是已正确维护的节点总数 @Override public boolean equals(Object other) { if (this == other) return true; if (other == null || getClass() != other.getClass()) return false; ArrayNTree<?> otherTree = (ArrayNTree<?>) other; // 已通过类型检查,执行unchecked cast return sameTree((ArrayNTree<T>) otherTree); } private boolean sameTree(ArrayNTree<T> xpto) { // 1. 比较当前节点的数据 if (!Objects.equals(this.data, xpto.data)) { return false; } // 2. 处理子节点数组的null情况与长度校验 if (this.children == null && xpto.children != null) { return false; } if (this.children != null && xpto.children == null) { return false; } if (this.children != null && xpto.children != null) { if (this.children.length != xpto.children.length) { return false; } // 3. 递归比较每个对应位置的子节点 for (int i = 0; i < this.children.length; i++) { ArrayNTree<T> child1 = this.children[i]; ArrayNTree<T> child2 = xpto.children[i]; // 处理子节点为null的场景,直接用Objects.equals递归判断 if (!Objects.equals(child1, child2)) { return false; } } } // 4. 最后比较size(若size维护正确,此步可省略,子节点相等则size必然一致) return this.size == xpto.size; } // 按Java规范,重写equals必须同步重写hashCode @Override public int hashCode() { int result = Objects.hash(data, size); result = 31 * result + Arrays.hashCode(children); return result; } }
代码解释
- 数据比较:用
Objects.equals替代==,完美兼容data为null的场景,确保比较的是内容而非对象引用。 - 子节点数组校验:先处理其中一个数组为
null的边界情况,再检查数组长度是否一致,最后遍历每个子节点递归判断相等性。 - size比较:如果你的
size字段在增删子节点时能同步更新,这一步可以作为额外校验;若担心size可能出现不一致,保留它能提升判断准确性。 - hashCode重写:遵循Java规范,保证
equals和hashCode的一致性,避免HashMap等集合类出现异常行为。
这样修改后,你的N叉树就能正确递归比较所有子节点,完成完整的相等性判断啦!
内容的提问来源于stack exchange,提问作者Filipe Nóbrega
相关产品推荐
相关产品推荐

