(Java) 使用从二叉树输出布尔值的函数式(类谓词)接口
(Java) Use functional (predicate-like) interface that outputs boolean value from Binary Tree
我有点麻烦:
我构建了一个二叉树 class,其中包含一些函数,这些函数对于此任务而言并不重要。每个节点都存储一个左右子节点和一个父节点。每个节点都有一个键值,可以看作是一个标签。
我创建了 3 classes:
Tree.java是节点的class。
BinaryTree.java 包含一些与整棵树相关的方法,例如 min/max 值。
Main.java 测试树的功能并包含主要方法。
我的问题:
我想用一个方法编写一个功能接口,该方法获取一个节点作为参数并输出一个布尔值。这可用于传入 Root 节点并递归检查树中的每个节点是否大于或小于某个值。但是,我对函数式接口完全陌生,我无法真正理解函数背后的逻辑。这是我到目前为止得到的:
@FunctionalInterface
public interface NodeOperation {
public abstract boolean forAll(Tree node);
}
NodeOperation overTwenty = (node) -> node.getValue() < 20;
当我尝试使用 lambda 表示法时,它不会 return 当我想要打印 overTwenty 时,我是一个布尔值。有人可以帮助我实现功能接口并向我解释如何访问布尔变量,以便我可以开始考虑如何为每个节点递归执行此操作。
如果你对二叉树了解不多,我建议你在维基百科上查一下。在我的例子中,我制作了一个 BST(二进制搜索树),这意味着它的结构是基于较大的值在右边,较小的值在左边。如果您需要我代码的某些特定部分,请提出建议,我会在此处 post :)
您创建的overTwenty
对象是一个函数。如果你想在你的树的一个节点中使用它,你必须在你的树的一个节点上调用它的唯一方法。例如,您可以这样称呼它:
boolean result = overTwenty.forAll(root);
顺便说一句,你的 NodeOperation
接口与 Function<Tree, Boolean>
相当,只是它 returns 是原始的 boolean
而不是 [=20] =] Boolean
.
在 java 中,接口的方法总是 public。这样你的界面就可以变成
@FuctionalInterface
public interface NodeOperation {
boolean forAll(Tree node);
}
所以你写了这行代码
NodeOperation overTwenty = (node) -> node.getValue() < 20;
Wich 会为您创建一个接口实例,用于检查节点的值是否低于 20
假设您有一个值为 30 的树节点实例
如果你打电话给
overTwenty.forAll(node) //will return false
这个函数不是递归的。如果要将函数应用于节点的所有子节点,则必须在树上编写递归方法 class
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
此方法将递归地应用节点操作,因此将检查树中的所有元素是否与您的函数匹配
我有点麻烦: 我构建了一个二叉树 class,其中包含一些函数,这些函数对于此任务而言并不重要。每个节点都存储一个左右子节点和一个父节点。每个节点都有一个键值,可以看作是一个标签。 我创建了 3 classes:
Tree.java是节点的class。
BinaryTree.java 包含一些与整棵树相关的方法,例如 min/max 值。
Main.java 测试树的功能并包含主要方法。
我的问题: 我想用一个方法编写一个功能接口,该方法获取一个节点作为参数并输出一个布尔值。这可用于传入 Root 节点并递归检查树中的每个节点是否大于或小于某个值。但是,我对函数式接口完全陌生,我无法真正理解函数背后的逻辑。这是我到目前为止得到的:
@FunctionalInterface
public interface NodeOperation {
public abstract boolean forAll(Tree node);
}
NodeOperation overTwenty = (node) -> node.getValue() < 20;
当我尝试使用 lambda 表示法时,它不会 return 当我想要打印 overTwenty 时,我是一个布尔值。有人可以帮助我实现功能接口并向我解释如何访问布尔变量,以便我可以开始考虑如何为每个节点递归执行此操作。
如果你对二叉树了解不多,我建议你在维基百科上查一下。在我的例子中,我制作了一个 BST(二进制搜索树),这意味着它的结构是基于较大的值在右边,较小的值在左边。如果您需要我代码的某些特定部分,请提出建议,我会在此处 post :)
您创建的overTwenty
对象是一个函数。如果你想在你的树的一个节点中使用它,你必须在你的树的一个节点上调用它的唯一方法。例如,您可以这样称呼它:
boolean result = overTwenty.forAll(root);
顺便说一句,你的 NodeOperation
接口与 Function<Tree, Boolean>
相当,只是它 returns 是原始的 boolean
而不是 [=20] =] Boolean
.
在 java 中,接口的方法总是 public。这样你的界面就可以变成
@FuctionalInterface
public interface NodeOperation {
boolean forAll(Tree node);
}
所以你写了这行代码
NodeOperation overTwenty = (node) -> node.getValue() < 20;
Wich 会为您创建一个接口实例,用于检查节点的值是否低于 20
假设您有一个值为 30 的树节点实例 如果你打电话给
overTwenty.forAll(node) //will return false
这个函数不是递归的。如果要将函数应用于节点的所有子节点,则必须在树上编写递归方法 class
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
此方法将递归地应用节点操作,因此将检查树中的所有元素是否与您的函数匹配