2016-04-13 161 views
0

爲什麼不能正常工作? 我不確定除了公式之外,你需要的其他信息是由一個字符型和一個使類型爲Term的int值給出的。比較ArrayLists和布爾值

// returns true if f is identical to this Formula 
// e.g. terms = {Term('C',2),Term('H',6)} and f = {Term('C',2),Term('H',6)} would return true 
// but terms = {Term('C',2),Term('H',6)} and f = {Term('H',6),Term('C',2)} would return false 

public boolean identical(Formula f) 
{ 
    int fSize = f.getTerms().size(); 

    if(fSize!=terms.size()) 
    { 
     return false; 
    } 
    else 
    { 
     for(int j = 0; j < fSize; j++) 
     { 
      Term tester = terms.get(j); 
      Term fTester = f.getTerms().get(j); 

      if(fTester == tester) 
      { 
       continue; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 

    return true; 
} 

N.B.術語是ArrayList的名稱

+4

也許是因爲你使用的是==操作符比較對象加以比較,而不是一個很好的等於執行 – Stultuske

+0

該死的,那麼它說Term不能轉換爲布爾值。 – Alfred

+4

可能是因爲'if(fTester == tester)'比較地址而不是內容。你需要實現'equals'並使用它來比較自定義對象。 –

回答

1

你需要比較不使用==,但使用equals方法,以便對象的內容進行比較的兩個對象。

由於Term是你的自定義類,你需要自己重寫此方法:

class Term { 
    char c; //the two values inside your Term class 
    int i; 

    @Override 
    public boolean equals(Object o){ 
    //checks omitted 
    Term other = (Term)o; 
    //now compare the contents: 
    return i==other.i && c==other.c; 
    } 
} 

然後你就可以使用

if(fTester.equals(tester)){ 
    continue; 
} 
+0

當重寫'equals()'時,必須重寫'hashCode()';我認爲這是值得一提的。 –

+0

@DmitryBychenko非常真實,但是當你被困在這些基礎知識中時,與hashCode()的合約只會令人困惑。 – f1sh

0

爲了比較Term的兩個對象,您需要覆蓋Term類中的方法equals()和hashCode()。您的代碼將是:

public boolean identical(Formula f) 
{ 
    int fSize = f.getTerms().size(); 
    if(fSize!=terms.size()){ 
     return false; 
    } else { 
     for(int j = 0; j < fSize; j++){ 
      Term tester = terms.get(j); 
      Term fTester = f.getTerms().get(j); 
      if(fTester.equals(tester)){ 
       continue; 
      } 
      else { 
       return false; 
      } 
     } 
    } 

    return true; 
}