复合模式中的递归方法

时间:2012-01-12 23:53:16

标签: java recursion

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

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();

    }
}

我已经决定发布我的代码的不同部分的片段。我现在遇到的问题是,例如我有一个高贵的A然后是一个贵族b,然后是一个贵族c。如果我将贵族c添加到贵族b b。添加(C)。并且我将b添加到a,a.add(B),我的计算Totaltaxdue()没有根据内部贵族c更新我的税。

公共类贵族延伸RiruritaniaSubjects {     ArrayList vassalsanddukes = new ArrayList();

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

    }
}


public double getTotalTaxDue(){
    calculateTaxDueByComponents();
    return totalTaxdue;
}



public class Prince   {
Land land;
ArrayList allprinceSubjects = new ArrayList();


public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    RiruritaniaSubjects allsubjects = new Nobles();
    RiruritaniaSubjects allsubject3 = new Nobles();
    RiruritaniaSubjects allsubject4 = new Nobles();
    allsubject4.add(allsubject3, 10);
    allsubjects.add(allsubject4, 10);
    System.out.println(allsubjects.getTotalTaxDue());


}

}

通过我自己的工作,输出应该是7,因为每个贵族应该是3.5,但我得到3.5作为输出是错误的。

3 个答案:

答案 0 :(得分:1)

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

此外,calculateTaxDueByComponents是一个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<RiruritaniaSubjects>而不是List

答案 1 :(得分:0)

您正在使用该方法调用方法,导致无限循环!只需删除该电话:

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

答案 2 :(得分:0)

我将假设calculateTaxDueByComponents属于RirutaniaSubjects。 你肯定会有堆栈溢出,因为你在这上面调用它。可能你想做:

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

    }
}