这个toRoot
方法应该返回一个列表,其中包含参数key
和根之间树中的所有键。我在类和junit测试方法中都使用了System.out.println
语句。为什么两个打印语句的输出不同? toRoot
方法中打印的输出是我想要的,但我只在junit测试方法中打印根。我该如何解决这个问题?
public List<K> toRoot(K key) {
List<K> list=new LinkedList<K>();
int i = key.compareTo(this.key);
if(i == 0){
list.add(this.key);
}
else if(i < 0){
left.toRoot(key);
list.add(this.key);
}
else if(i > 0){
right.toRoot(key);
list.add(this.key);
}
System.out.print(list); //prints "i o n p s z i"...these are the desired
//outputs of the two assertEquals combined together
return list;
}
JUnit Testing
@Test public void testToRoot() {
Tree<Character, Integer> tree = tree1();
System.out.print(tree.toRoot('o')); //prints 'i'
assertEquals("i", tree.toRoot('i'));
assertEquals("o n p s z i", tree.toRoot('o'));
}
private static Tree<Character, Integer> tree1() {
Tree<Character, Integer> tree = EmptyTree.getInstance();
tree= tree.add('i', 1);
tree= tree.add('z', 2);
tree= tree.add('e', 3);
tree= tree.add('s', 4);
tree= tree.add('p', 5);
tree= tree.add('n', 6);
tree= tree.add('b', 7);
tree= tree.add('h', 8);
tree= tree.add('o', 9);
tree= tree.add('f', 10);
return tree;
}
其他细节:
树类是NotEmptyTree
类实现的接口,包括覆盖的toRoot
。
public NonEmptyTree<K, V> add(K key, V value);
以下是NotEmptyTree
类
public NotEmptyTree<K, V> add(K key, V value) {
if(key.compareTo(this.key) == 0){
this.value = value;
}else if(key.compareTo(this.key) < 0){
left = left.add(key, value);
}else{
right = right.add(key, value);
}
return this;
}
字母表前面附近的字母小于朝向字母前面的字母。在这种情况下,'i'
是'e'
和'z'
的父节点。 'z'
的左侧孩子为's'
,其子女为'p'
,其子女为'n'
,其子女为'o'
。 'e'
已留下'b'
的孩子,其中有'h'
的正确孩子。
答案 0 :(得分:0)
您的toRoot
方法可能会将字符串打印到System.out
,但它不会返回 a String
。相反,它返回List
。因此,您的断言将始终为假,因为String
不等于List
。
如果要与String
进行比较,那么您需要编写一个函数,将List<K>
转换为空格分隔的String
,然后再调用该函数致电assertEquals
。
另一种选择是使用像Hamcrest这样的contains
式匹配器:
assertThat(tree.toRoot(), contains('o', 'n', 'p', 's', 'z', 'i'));
请注意,尽管有名称,但contains
会进行有序检查,因此即使密钥出现故障,此测试也会失败,这会导致assertEquals
检查您的行为相同以前正在制作。