为了账号安全,请及时绑定邮箱和手机立即绑定

(Java)使用从二叉树输出布尔值的功能(类谓词)接口

(Java)使用从二叉树输出布尔值的功能(类谓词)接口

哈士奇WWW 2022-05-12 16:09:53
我有点麻烦:我构建了一个二叉树类,其中包含一些对于此任务而言并不有趣的函数。每个节点都存储一个左右子节点和一个父节点。每个节点都有一个键值,可以看作是一个标签。我创建了 3 个类:Tree.java 是一个节点的类。BinaryTree.java 包含一些与整个树相关的方法,例如最小值/最大值。Main.java 测试 Tree 的特性并包含 main 方法。我的问题: 我想用一个方法编写一个功能接口,该方法将节点作为参数并输出一个布尔值。这可用于传入根节点并递归检查树中的每个节点是否大于或小于一个值。但是,我对功能接口完全陌生,我无法真正掌握功能背后的逻辑。这是我到目前为止得到的:@FunctionalInterfacepublic interface NodeOperation {    public abstract boolean forAll(Tree node);}NodeOperation overTwenty = (node) -> node.getValue() < 20;当我尝试使用 lambda 表示法时,当我想打印 overTwenty 时它不会返回布尔值。有人可以帮我实现功能接口并解释我如何访问布尔变量,以便我可以开始考虑如何为每个节点递归地执行此操作。如果您对二叉树不太了解,建议您在 Wikipedia 上查找。就我而言,我制作了一个 BST(二叉搜索树),这意味着它的结构基于右侧的较大值和左侧的较小值。如果您需要我的代码的某些特定部分,只需提出建议,我将在此处发布:)
查看完整描述

2 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

在java中,接口的方法总是公开的。所以你的界面可以变成


@FuctionalInterface

    public interface NodeOperation {

        boolean forAll(Tree node);

    }

所以你写了这行代码


NodeOperation overTwenty = (node) -> node.getValue() < 20;

Wich 会为您创建一个接口实例,用于检查节点的值是否低于 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 中的所有元素是否与您的函数匹配


查看完整回答
反对 回复 2022-05-12
?
MMTTMM

TA贡献1869条经验 获得超4个赞

您创建的overTwenty对象是一个函数。如果要在树的节点中使用它,则必须在树的节点上调用它的唯一方法。例如,您可以这样称呼它:

boolean result = overTwenty.forAll(root);

顺便说一句,您的NodeOperationinterface 与 a 非常等价,Function<Tree, Boolean>只是它返回的是原语boolean而不是 class Boolean


查看完整回答
反对 回复 2022-05-12
  • 2 回答
  • 0 关注
  • 136 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信