如何从树公式中收集变量

时间:2014-03-16 13:29:32

标签: java

问题标题可能表达不佳,所以我很抱歉。我将命题逻辑公式表示为Java中的树,如下所示:

abstract class Formula { }

final class AndFormula extends Formula {
  private Formula leftChild, rightChild;

  public AndFormula(Formula leftChild, Formula rightChild) {
    this.leftChild = leftChild;
    this.rightChild = rightChild;
  }

  // add some getters...

}

final class OrFormula extends Formula {
  private Formula leftChild, rightChild;

  public OrFormula(Formula leftChild, Formula rightChild) {
    this.leftChild = leftChild;
    this.rightChild = rightChild;
  }

  // add some getters...

}

final class AtomicFormula extends Formula {
  private String name;

  public AtomicFormula(String name) {
    this.name = name;
  }

  // add some getters...

}

现在让我们说我想以一种非常特殊的方式收集原子公式的名称:我只想要原子公式的名称,这些名称永远不会出现在OrFormula的右侧。我有以下内容:

public static Set<String> specialVars(Formula f) {

  Set<String> ans = new HashSet<String>();

  if( f.getClass() == AndFormula.class ) {
    // Recursively add all special vars from the left child:
    ans.addAll( specialsVar( f.leftChild ) );

    // Recursively add all special vars from the right child:
    ans.addAll( specialsVar( f.rightChild ) );
  } else if( f.getClass() == OrFormula.class ) {
    // Recursively add all special vars from the left child:
    ans.addAll( specialsVar( f.leftChild ) );

    // Don't add anything from the right child!
  } else if( f.getClass() === AtomicFormula.class ) {
    // The base case:
    ans.add( f.getName() );
  }

  return ans;
}

这段代码似乎有效,所以我的问题是:这是惯用的Java吗?如果没有,那么编写这段代码的惯用方法是什么?是否有任何我应该注意到的意外行为?

谢谢!

0 个答案:

没有答案