2016-04-13 3 views
0

Почему это не работает? Я не уверен, что другая информация, которую вам потребуется, помимо формулы, задается символом char и int, который создает тип Term.Сравнение 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; 
} 

нотабене термины - это имя ArrayList

+4

может быть, потому что вы сравниваете объектов с помощью оператора ==, вместо хорошей реализации равна – Stultuske

+0

проклятый, тогда он говорит, что термин не может быть преобразован в логическое. – 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, которые необходимо переопределить методы equals() и hashCode() в классе Term. Ваш код будет:

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; 
} 
Смежные вопросы