2016-04-07 13 views
0

私はライブラリブックのシミュレーションを行っています。私が執着している現在の部分は、toStringメソッドが呼び出されたときにローン上の本の数を見つけようとしています。Java:arraylistでオカレンスを数え、その出力をtoStringに出力するには?

public class Biblio{ 
    private ArrayList<Book> collection; 
    private int loanCount; 

書籍の状態は、私が上で立ち往生していたコードタイプの列挙型の

public enum Status {LOAN, REFERENCE, AVAILABLE}; 

です:

public int numberOfBooksOnLoan(){ 
    int loanCount= 0; 
    for(Book onLoan: collection){ 
     if(onLoan.getBookStatus()== Status.LOAN){ 
      loanCount++;  
     } 
    } 
    return loanCount; 
} 


     @Override 
public String toString(){ 
    StringBuilder string= new StringBuilder(); 
    string.append("total number of books: ").append(bookCollection.size()).append("\n"); 
    string.append("number of loaned books: ").append(loanCount).append("\n"); 
    return string.toString(); 
} 

両方numberOfBooksOnLoantoString方法はBiblioクラスに

あります

私がtoStringを使用した場合hodの場合は、書籍が貸与されている場合でも、値0が印刷されます。これは、このクラスのgetLoanCountメソッドとは異なり、必要な値が印刷されます。

私はarraylistを経由してローンにあるすべての本を数え、この値を変数に格納してtoStringで使用できるようにするにはどうすればよいですか?より一般的には、どのようにarraylistを通過し、共通の特定の変数を持つすべてのオブジェクトを数えますか?場合

これが問題の一部であり、私は警告

int loanCount = 0;

+0

ローカル変数を削除して? –

答えて

1

を参照して「ローカル変数がフィールドを隠し」持っているあなたもloanCount呼ばれるインスタンス変数を持っていますか?答えがイエスであれば、インスタンス1つを取り外してみてくださいし、メソッドを呼び出すためのtoStringを変更:

@Override 
public String toString(){ 
    StringBuilder string= new StringBuilder(); 
    string.append("total number of books: ").append(bookCollection.size()).append("\n"); 
    string.append("number of loaned books: ").append(numberOfBooksOnLoan()).append("\n"); 
    return string.toString(); 
} 
+0

これは機能します。助けてくれてありがとう! – Maitiu

-1
public int numberOfBooksOnLoan(){ 
int loanCount= 0; 
for(Book onLoan: collection){ 
    if(onLoan.getBookStatus()== Status.LOAN){ 
     loanCount++;  
    } 
} 
return loanCount; 
} 

あなたはnumberOfBooksOnLoan()でローカル変数を作成しているが、あなたのtoString()方法であなたは、クラス属性loanCountを使用しています。

numberOfBooksOnLoan()intint loanCount= 0;から削除するだけで、ローカル変数ではなくclass属性を使用します。

+1

値は計算されるが、インスタンスフィールドに格納されるため、これは良い考えではありません。 'toString()'が 'numberOfBooksOnLoan()'の前に呼び出されたとき、または基礎となるコレクションが変更された後で 'numberOfBooksOnLoad()'が呼び出される前にどうなるでしょうか? 'toString()'(またはそれが必要な場所)から直接計算メソッドを呼び出すほうがよいでしょう。 –

+0

ああ、あなたの権利、totalyはそれを逃した – Dimi

関連する問題