【发布时间】:2014-03-07 02:05:36
【问题描述】:
所以我对面向对象编程还是很陌生,我正在尝试更多地了解 Java 中的抽象类和接口。在网上闲逛时,我发现了一些遍历树的代码:
import java.util.*;
public class TreeTraverser
{
// Please do not change this interface
public static interface Node
{
int getValue();
List<Node> getChildren();
}
public static List<Node> traverseTreeInWidth(Node root)
{
/*
Please implement this method to
traverse the tree in width and return a list of all passed nodes.
The list should start with the root node, next
it should contain all second-level nodes, then third-level nodes etc.
The method shall work optimally with large trees.
*/
List<Node> passedNodes = new ArrayList<Node>();
passedNodes.add(root);
for (int i=0; i<passedNodes.size(); i++)
{
for (Node child: passedNodes.get(i).getChildren())
passedNodes.add(child);
}
return passedNodes;
}
}
我的第一个问题与界面有关。我认为接口通常有自己的文件,将它包含在这样的类中的目的/好处是什么?
我的第二个问题是我如何能够访问此代码并使用我自己的树对其进行测试?我知道,如果我有另一个课程,我需要类似的东西:
public class Test implements TreeTraverser.Node {...}
但是,如果我尝试创建自己的 Node 类,然后覆盖接口中的方法,我会收到一个错误,即我的 public List getChildren() 的返回类型不兼容,所以我不确定如何测试我的自己的树。
提前感谢您尝试帮助我。
【问题讨论】:
-
在类中包含
interface的好处是,您可以将其称为TreeTraverser.Node,以区别于您在其他地方可能拥有的其他Node接口,并强调Node的定义与TreeTraverser应该如何工作有关,以提高可读性。并且:您应该能够按照您所说的方式编写Test课程;如果它给你一个错误,你做错了什么。请发布您尝试过的Test课程。 -
你实现的时候,有没有把返回类型设为
List<TreeTraverser.Node>?那应该行得通。List<Node>不会,因为没有外部类名,Node不可见。 -
据我所知,这是一个 betterprogrammer.com 难题的解决方案