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