Java 复合模式中的递归方法

Java 复合模式中的递归方法,java,recursion,Java,Recursion,您好,我有一个components类,它可以包含components和composite,我正在编写一个方法来计算其组件中所有税费的总和。这个类是复合模式代码的一部分。问题是我的递归方法工作不正常。我有一个堆栈溢出,但为了测试我的方法,我只有两个我的数组列表中的对象 public class Nobles extends RiruritaniaSubjects { ArrayList vassalsanddukes = new ArrayList(); public void

您好,我有一个components类,它可以包含components和composite,我正在编写一个方法来计算其组件中所有税费的总和。这个类是复合模式代码的一部分。问题是我的递归方法工作不正常。我有一个堆栈溢出,但为了测试我的方法,我只有两个我的数组列表中的对象

public class Nobles extends RiruritaniaSubjects
{
    ArrayList vassalsanddukes = new ArrayList();

    public void calculateTaxDueByComponents(){
        Iterator iterator = vassalsanddukes.iterator();
        while(iterator.hasNext()){
            RiruritaniaSubjects vassalandduke=(RiruritaniaSubjects) iterator.next();
            totalTaxdue+=vassalandduke.getTaxDue();
            calculateTaxDueByComponents();
        }
    }
}
RiruritaniaSubjects是一个抽象类,我让我的另一个复合类对其进行了扩展。我已经编辑了代码,堆栈溢出已经停止,但我的另一个问题是,如果一个组件包含一个组件,它似乎没有增加到期税款

public void calculateTaxDueByComponents(){
    Iterator iterator = vassalsanddukes.iterator();
    while(iterator.hasNext()){
        RiruritaniaSubjects vassalandduke=(RiruritaniaSubjects) iterator.next();
        totalTaxdue+=vassalandduke.getTaxDue();
        vassalandduke.calculateTaxDueByComponents();

    }
}
我决定发布代码不同部分的片段。我现在遇到的问题是,例如,我有一个noble a,然后是noble b,然后是noble c。如果我将noble c添加到noble b b中,则添加(c)。我把b加到a,a.add(b),我的calculate Totaltaxdue()并没有用内部noble c更新我的到期税款

公共阶级贵族扩展了Riruritaniasobjects{ ArrayList vassalsanddukes=新的ArrayList()

}


根据我自己的工作,输出应该是7,因为每个noble的输出应该是3.5,但我得到的输出是3.5,这是错误的。

您使用该方法从调用该方法,导致无限循环!只需删除该呼叫:

public void calculateTaxDueByComponents(){
    Iterator iterator = vassalsanddukes.iterator();
    while(iterator.hasNext()){
        RiruritaniaSubjects vassalandduke=(RiruritaniaSubjects) iterator.next();
        totalTaxdue+=vassalandduke.getTaxDue();
        // calculateTaxDueByComponents(); DON't DO THIS!
    }
}

我将假设CalculateSaxDuebyComponents属于RirutaniasObject。 您肯定会有堆栈溢出,因为您正在对此进行调用。可能您想做:

public void calculateTaxDueByComponents(){
    Iterator iterator = vassalsanddukes.iterator();
    int totalTaxDue = getTaxDue();
    while(iterator.hasNext()){
        RiruritaniaSubjects vassalandduke=(RiruritaniaSubjects) iterator.next();
        totalTaxdue+=vassalandduke.calculateTaxDueByComponents();

    }
}

您在
this
上调用
calculatesaxduebycomponents
方法,而不是在您的子组件上调用它

此外,CalculateSaxDuebyComponents是一种void方法。它不会返回任何东西。因此,不可能将其结果(因为它没有任何结果)添加到当前组件应付的税款中。您的方法可能如下所示:

public int calculateTaxDueByComponents() {
    int taxDueByThisComponent = getTaxDue();
    int taxDueByThisComponentAndAllItsSubComponentsRecursively = taxDueByThisComponent;
    Iterator iterator = vassalsanddukes.iterator();
    while(iterator.hasNext()){
        RiruritaniaSubjects vassalandduke=(RiruritaniaSubjects) iterator.next();
        taxDueByThisComponentAndAllItsSubComponentsRecursively += vassalandduke.calculateTaxDueByComponents();
    }
    return taxDueByThisComponentAndAllItsSubComponentsRecursively;
}

旁注:如果使用泛型集合,您的代码将更具可读性和类型安全性:
List
而不是
List

如果这是家庭作业,请添加家庭作业标记。但是每次都会得到一个新的迭代器;你从不重复。你只要一次又一次地得到第一个,直到你的机器倒下。你想干什么?递归或迭代,不要两者都做。我需要迭代,因为我有一个包含对象的数组列表,所以我需要遍历每个不太递归的对象。我更改了方法并注意到了一些错误。我还观察到一件事,如果一个组件包含一个对象,该方法不深入或无法识别对象。我不理解您所说的“如果组件包含对象”是什么意思。该方法执行其Java代码要求它执行的操作。它应该“识别”什么样的物体?对不起,我指的是贵族。e、 我有一个贵族对象a,然后创建贵族对象b和贵族对象c。然后我加上(c)。然后a.add(b)。该方法不会用我从c获得的税款更新到期总税款。谢谢jb,我有一个返回到期总税款的方法。我重新发布了代码。必须对每个对象执行getTaxDUe方法,它将对每个对象执行;它在您当前正在计算税款的对象上调用。对于主题(迭代器中没有任何元素),它是唯一调用的方法。
public int calculateTaxDueByComponents() {
    int taxDueByThisComponent = getTaxDue();
    int taxDueByThisComponentAndAllItsSubComponentsRecursively = taxDueByThisComponent;
    Iterator iterator = vassalsanddukes.iterator();
    while(iterator.hasNext()){
        RiruritaniaSubjects vassalandduke=(RiruritaniaSubjects) iterator.next();
        taxDueByThisComponentAndAllItsSubComponentsRecursively += vassalandduke.calculateTaxDueByComponents();
    }
    return taxDueByThisComponentAndAllItsSubComponentsRecursively;
}