我有点麻烦: 我构建了一个Binary Tree类,其中包含一些对于此任务而言并不有趣的功能。每个节点都存储一个左,右子级以及一个父级。每个节点都有一个键值,可以将其视为标签。 我创建了3个课程:
Tree.java是节点的类。
BinaryTree.java包含一些与整个树相关的方法,例如最小/最大值。
Main.java,它测试Tree的功能并包含main方法。
我的问题: 我想用一个方法来编写一个功能接口,该方法以节点作为参数并输出布尔值。这可用于传递“根”节点,并递归检查树中的每个节点是否大于或小于某个值。但是,我对功能接口完全陌生,我无法真正掌握功能背后的逻辑。这是我到目前为止所得到的:
@FunctionalInterface
public interface NodeOperation {
public abstract boolean forAll(Tree node);
}
NodeOperation overTwenty = (node) -> node.getValue() < 20;
当我尝试使用lambda表示法时,当我要打印overTwenty时,它不会返回布尔值。有人可以帮助我实现功能性接口并向我解释如何访问布尔变量,以便我可以开始思考如何为每个节点递归执行此操作。
如果您对二叉树不太了解,建议您在Wikipedia上查找。以我为例,我制作了一个BST(二进制搜索树),这意味着其结构是基于较大的值在右侧,较小的值在左侧。如果您需要我的代码的某些特定部分,只需提出建议,然后将其张贴在这里:)
答案 0 :(得分:1)
在Java中,接口的方法始终是公共的。这样您的界面就可以成为
@FuctionalInterface
public interface NodeOperation {
boolean forAll(Tree node);
}
所以您已经编写了这一行代码
NodeOperation overTwenty = (node) -> node.getValue() < 20;
将为您创建一个接口实例,以检查节点的值是否小于20
因此,假设您有一个值为30的Tree节点实例。 如果您致电
overTwenty.forAll(node) //will return false
此函数不是递归的。如果要将功能应用于节点的所有子节点,则必须在Tree类上编写一个递归方法
public class Tree{
...
public boolean recursiveNodeOperation(NodeOperation operation) {
if(!operation.forAll(this)) return false;
for(Tree child : children)
if(! child.recursiveNodeOperation(operation))
return false
return true ;
}
}
root.recursiveNodeOperation(overTwenty); //will return true if all the nodes of the Tree starting from root are lower than 20
此方法将递归应用Node操作,因此将检查Tree中的所有元素是否与您的函数匹配
答案 1 :(得分:0)
您创建的overTwenty
对象是一个函数。如果要在树的节点中使用它,则必须在树的节点上调用它的唯一方法。例如,您可以这样称呼它:
boolean result = overTwenty.forAll(root);
顺便说一下,您的NodeOperation
接口与Function<Tree, Boolean>
相当,区别是它返回的是原始boolean
而不是类Boolean
。