2012-01-12 6 views
0

こんにちは、コンポーネントとコンポジットを含むことができるコンポーネントクラスを持っています。コンポーネントのすべての税金の合計を計算するメソッドを記述しています。このクラスは複合パターンコードの一部です。問題は再帰的な私のメソッドは正常に動作していません私はスタックのオーバーフローがありますが、私のメソッドをテストするために私は2つのオブジェクトを私の配列のリストに持っています。コンポジットパターンの再帰メソッド

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は抽象クラスであり、私は私の他の複合クラスはit.Iが停止したコードと、スタックオーバーフローを編集しましたが、私の他の問題が原因コンポーネントがあれば、税に追加しないように思われるで拡張していコンポーネントを含んでいます。私は、高貴A高貴Bを持っているなどのためである私は、iはC高貴追加高貴c.Ifそして、私が今持っています私のcode.The問題のさまざまな部分のスニペットを投稿することを決定した

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

    } 
} 

貴族b b.add(C)。私はbをa、a.add(B)に追加します。私の計算Totaltaxdue()は内部貴族cのために税金を更新していません。

パブリッククラスNobles extends RiruritaniaSubjects { ArrayList vassalsanddukes = new ArrayList();それは、各貴族のために3.5でなければなりませんので、私自身の働きによって

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を取得しています。

+1

宿題の場合は、宿題タグを追加してください。 –

+1

しかし、毎回新しいイテレータが得られます。あなたは決して反復することはありません。あなたはあなたのマシンが転倒するまで、最初のものを何度も何度もやります。あなたは何をしようとしているのですか?反復するか反復するかのどちらかを行います。 –

+0

私はオブジェクトを含む配列リストを持っているので、私は各オブジェクトを通過する必要があるので、反復する必要があります –

答えて

0

このメソッドを呼び出すと、メソッドが無限ループになります。そのコールを削除するだけです:

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

それほど多くの再帰はありません。 –

+0

メソッドを変更し、私が受け取ったいくつかのエラーを指摘しました –

0

calculateTaxDueByComponentsはRirutaniaSubjectsに属していると仮定します。 これでスタックオーバーフローを呼び出すので、確かにスタックオーバーフローが発生します。おそらく、あなたは何をしたい:

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

    } 
} 
+0

getTaxDUeメソッドはすべてのオブジェクトで実行する必要があります –

+0

これはすべてのオブジェクトで実行されます。現在税を計算しているオブジェクトで呼び出されます。イテレータに要素を持たないサブジェクトに対しては、それが呼び出される唯一のメソッドです。 – Luis

1

あなたのサブコンポーネントでそれを呼び出すためにthisではなく、上calculateTaxDueByComponentsメソッドを呼び出しています。

また、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:あなたはジェネリックコレクションを使用した場合、あなたのコードをより読みやすくタイプセーフになります。

+0

コンポーネントにオブジェクトが含まれている場合はもう1つのことを観察しました。このメソッドは深く進まず、オブジェクトを認識しません。 –

+0

「コンポーネントにオブジェクトが含まれている場合」という意味を理解できません。このメソッドは、Javaコードが指示する内容を行います。どのようなオブジェクトを "認識"すべきですか? –

+0

申し訳ありませんが、私が意味するオブジェクトは貴族でした。例えば、貴族オブジェクトA.iを所有し、次に貴族オブジェクトbおよび貴族オブジェクトcを作成する。それからi b.add(c)。次に、a.add(b)。このメソッドは、cからの自分の税金に起因する総税金を更新しません。 –