2016-04-09 5 views
0

これまで、私はExpenseItemというクラスを使って経費をモデル化することができました。このクラスは、属性の名前、量、頻度を使用して費用をモデル化します。属性は、そのクラスのプライベートメンバーとしてモデル化する必要があります。したがって、私はこれらの3つの引数を取るコンストラクタを使用しました。オブジェクトのトラブルメソッドを呼び出す - Java

私はトラブルクラスに次のメソッドを実装することだ:

annualTotal。 ExpenseItemオブジェクトの推定総経費を返すことになっています。それは量*周波数である必要があります。

私はExpenseItemからすべての金額と頻度を集めて合計を得ることができるので、メソッドを実装するのが難しいです。これまでのところ私は3を持っている:

ExpenseItem e1 = new ExpenseItem ("Coffee", 2.25 , 6); 
ExpenseItem e2 = new ExpenseItem ("Food", 5.30 , 5); 
ExpenseItem e3 = new ExpenseItem ("Gas", 20.00 , 2); 

にはどうすれば... E1、E2、E3、E(n)のからダブルスを取り、それぞれの費用を掛ける方法を実装していますか?例えば以下、E1 annualTotal = 2.25 * 6

現在のコード:

public class ExpenseItem { 

private String name; 
public double amount; 
public double frequency; 
public double total; 
public ExpenseItem(String name, double amount, double frequency) { 
    this.name = name; 
    setAmount(amount); 
    setFrequency(frequency); 

} 
public double annualTotal(double amount, double frequency){ 
    double total= amount+frequency; 
    return total; 
    //System.out.printf("the total is:",total); 
} 

public void setName(String name){ 
    this.name = name; 
} 

public String getName(){ 
    return name; 
} 
public void setAmount(double amount){ 
    this.amount = amount>=0 ? amount:0 ; 
} 
public double getAmount(){ 
    return amount; 
} 
public void setFrequency(double frequency){ 
     this.frequency = frequency>=0 ? frequency:0 ; 
} 
public double getFrequency(){ 
     return frequency; 
} 

public static void main(String[] args) { 
ExpenseItem e1 = new ExpenseItem ("Coffee", 2.25 , 6); 
ExpenseItem e2 = new ExpenseItem ("Food", 5.30 , 5); 
ExpenseItem e3 = new ExpenseItem ("Gas", 20.00 , 2); 

System.out.println("Expense Item  Amount Frequency\n"); 
    outputInfo(e1);outputInfo(e2);outputInfo(e3); 
} 

private static void outputInfo(ExpenseItem e){ 
System.out.printf("%-15s\t%5.2f\t%5.0f\n", 
e.getName(),e.getAmount(), e.getFrequency()); 
    } 

    } 
+1

あなたは1つのExpenseItemからそれを得ることはできません - それは非常に面白い平均ではありません。 ExpenseItemのリストを作成して平均化する可能性が高くなります。 – duffymo

+0

はい、すべての経費明細を保持する何らかのホルダークラス(たとえば、ExpenseAccount)を作成する必要があります。 ExpenseAccountでExpenseItemsを合計する方法を作成します。 – markspace

答えて

0

クラスExpenseItemは、インスタンス内のすべての計算のためにしたい要素を持っているので、代わりにこの方法

public double annualTotal(double amount, double frequency){ 
    double total= amount+frequency; 
    return total; 
    //System.out.printf("the total is:",total); 
} 
を定義します

は、私が目を定義したものに、この

public double annualTotal(){ 

    return (double)this.amount * this.frequency; 

} 

追加を行いますATIC acumulatorメンバー(その谷はクラスではなくオブジェクトのためであるので)

public class ExpenseItem { 

private String name; 
public double amount; 
public double frequency; 
public double total; 

public static double totalAcumulator = 0; //here is the trick 
public ExpenseItem(String name, double amount, double frequency) { 
    this.name = name; 
    setAmount(amount); 
    setFrequency(frequency); 
    totalAcumulator += annualTotal(); // and you call it every time you construct an object. 
} 

と、あなたはさらに+演算子の代わりに、乗算*演算子を使用している

ExpenseItem.totalAcumulator 
+0

ああ、意味があります。今はannualTotal()のような静的ではないメソッドへの静的な参照を作成できないと主張しているので、主な関数に表示/表示するのに問題があります。コードの最後にこの合計を表示したいと考えています。それを助けてくれる? – Claude

0

を呼び出すことによって、その値を得ることができます

あなたの関数

public double annualTotal(double amount, double frequency){ 
double total= amount+frequency; 
return total; 
//System.out.printf("the total is:",total); 

}

public double annualTotal(double amount, double frequency){ 
double total= amount * frequency; 
return total; 
//System.out.printf("the total is:",total); 

}

の下にその助けをいのようにすべきですか?

0

このような場合は、不変オブジェクトを使用することが理にかなっています。

public class ExpenseItem { 

    private final String name; 
    private final double amount; 
    private final double frequency; 
    private final double total; 

    public ExpenseItem(String name, double amount, double frequency) { 
     this.name = name; 
     this.amount = amount >= 0 ? amount : 0; 
     this.frequency = frequency >= 0 ? frequency : 0; 
     this.total = amount * frequency; 
    } 

    public String getName() { 
     return name; 
    } 

    public double getAmount() { 
     return amount; 
    } 

    public double getFrequency() { 
     return frequency; 
    } 

    public double getTotal() { 
     return total; 
    } 

    @Override 
    public String toString() { 
     return String.format("%-10s%-10.2f%-5.0f%1.2f", name, amount, frequency, total); 
    } 

    public static void main(String[] args) { 
     ExpenseItem e1 = new ExpenseItem ("Coffee", 2.25 , 6); 
     ExpenseItem e2 = new ExpenseItem ("Food", 5.30 , 5); 
     ExpenseItem e3 = new ExpenseItem ("Gas", 20.00 , 2); 

     System.out.println(e1); 
     System.out.println(e2); 
     System.out.println(e3); 

     double total = e1.getTotal() + e2.getTotal() + e3.getTotal();  
     System.out.println(String.format("\n%-25s%1.2f", "Total", total)); 
    } 
} 

出力::totalが派生フィールドであるので

public static void main(String[] args) { 
    List<ExpenseItem> list = Arrays.asList(
      new ExpenseItem ("Coffee", 2.25 , 6), 
      new ExpenseItem ("Food", 5.30 , 5), 
      new ExpenseItem ("Gas", 20.00 , 2) 
      ); 

    double total = 0; 
    for(ExpenseItem e : list) { 
     System.out.println(e); 
     total += e.getTotal(); 
    } 

    System.out.println(String.format("\n%-25s%1.2f", "Total", total)); 
} 

同じ出力を生成します。

Coffee 2.25  6 13.50 
Food  5.30  5 26.50 
Gas  20.00  2 40.00 

Total     80.00 

リスト内ExpenseItem秒も持つことができます。

関連する問題