【发布时间】:2016-12-13 09:53:15
【问题描述】:
我正在尝试回答 Cracking the Coding Interview 中的以下问题。下面的代码是 GitHub 上一个项目的一部分,here。
给定一棵二叉搜索树,设计一个算法,在每个深度创建一个所有节点的链表(即,如果你有一棵深度为 D 的树,你将有 D 个链表)。
作为一名优秀的小开发人员,我编写了一个单元测试来检查这一点。
@Test
public void testGetValuesAtEachLevel() {
Integer[] treeValues = {
1, 2, 3, 4, 5,
6, 7, 8, 9, 10,
11, 12, 13, 14, 15
};
tree = new GenericBinaryTree<>(treeValues);
Integer[][] expectedArray = {
{ 1 },
{ 2, 3 },
{ 4, 5, 6, 7 },
{ 8, 9, 10, 11, 12, 13, 14, 15 }
};
List<List<Node<Integer>>> expectedList = new ArrayList<>(4);
for (Integer[] level : expectedArray) {
List<Node<Integer>> list = new LinkedList<>();
for (Integer value : level) {
list.add(new Node<>(value));
}
expectedList.add(list);
}
assertEquals(expectedList, tree.getValuesAtEachLevel());
}
这是代码。
List<List<Node<T>>> getValuesAtEachLevel() {
List<List<Node<T>>> results = new ArrayList<>();
List<Node<T>> firstLevel = new LinkedList<>();
firstLevel.add(getRoot());
results.add(firstLevel);
loadAtLevel(results, 1);
return results;
}
private void loadAtLevel(List<List<Node<T>>> list, int level) {
List<Node<T>> levelList = new LinkedList<Node<T>>();
for (Node<T> node : list.get(level - 1)) {
if (node.left() != null) levelList.add(node.left());
if (node.right() != null) levelList.add(node.right());
}
if (levelList.isEmpty()) return;
level++;
list.add(levelList);
loadAtLevel(list, level);
}
想象一下当单元测试失败并出现以下错误时我的惊讶:
java.lang.AssertionError: expected:
java.util.ArrayList<[[1], [2, 3], [4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14, 15]]> but was:
java.util.ArrayList<[[1], [2, 3], [4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14, 15]]>
字符串表示是相同的,所以我无法弄清楚这里发生了什么。事实上,如果我将断言更改为此,测试通过:
assertEquals(expectedList.toString(), tree.getValuesAtEachLevel().toString());
我感觉我即将学习有关接口和对象的非常有价值的东西。我在这里做错了什么?
【问题讨论】:
-
可能数字的类型不同(int vs long)
-
你还没有展示你的
Node类 - 我猜它不会覆盖 equals/hashCode。 -
^^ 乔恩说的。如果与之比较的对象也是一个长度相同的列表并且所有条目的
equals返回 true,则 ArrayList#equals 将返回 true。因此,除非Node定义equals,否则具有不同但等效Node实例的两个列表将不相等。 -
这里是
Node的代码,实际上它没有定义equals和hashCode:github.com/dishbreak/cracking-coding/blob/…
标签: java collections junit