2016-08-03 6 views
-1

Я пытаюсь проверить свой код, но последний System.out.printl не отвечает, почему?исправить тест с помощью метода equals() и переопределить этот и hashCode()

@Test 
public void testcopy(){ 
    RomanNumber rn1 = new RomanNumber("M"); 
    RomanNumber rn2 = new RomanNumber("M"); 
    RomanNumber rn1_copy = rn1; 
    System.out.println("rn1 == rn1_copy is " 
      + (rn1 == rn1_copy)); 
    System.out.println("rn1 == rn2 is " + (rn1 == rn2)); 
    System.out.println("rn1.equals(rn2) is " + (rn1.equals(rn2))); 
} 

Опять же, я хочу, чтобы переопределить equals() метод суперкласса Object, я попытался это:

public boolean equals(Object obj) { 
    if ((obj instanceof RomanNumber)) { 
     RomanNumber decimal = (RomanNumber) obj; 
     if (number == decimal.convertToInteger() && number.equals(decimal.convertToInteger)) { 
      return true; 
     } else { 
      return false; 
     } 
    } else { 
     return false; 
    } 
} 

Наконец, я выкладываю ниже всего кода, что делает:

public class RomanNumber { 

    private String number; 

    public RomanNumber (String number){ 
     this.number = number; 
    } 

    /** 
    * @return integer equivalent of this roman number 
    */ 
    public int convertToInteger() { 
     int decimal = 0; 
     int lastNumber = 0; 
     // take the string roman number 
     // write algorithm to convert it to int 
     // return int 

     number = number.toUpperCase(); 
     for (int x = number.length() - 1; x >= 0; x--) { 
      char convertNumber = number.charAt(x); 
      switch (convertNumber) { 
       case 'M': 
        decimal = processDecimal(1000, lastNumber, decimal); 
        lastNumber = 1000; 
        break; 

       case 'D': 
        decimal = processDecimal(500, lastNumber, decimal); 
        lastNumber = 500; 
        break; 

       case 'C': 
        decimal = processDecimal(100, lastNumber, decimal); 
        lastNumber = 100; 
        break; 

       case 'L': 
        decimal = processDecimal(50, lastNumber, decimal); 
        lastNumber = 50; 
        break; 

       case 'X': 
        decimal = processDecimal(10, lastNumber, decimal); 
        lastNumber = 10; 
        break; 

       case 'V': 
        decimal = processDecimal(5, lastNumber, decimal); 
        lastNumber = 5; 
        break; 

       case 'I': 
        decimal = processDecimal(1, lastNumber, decimal); 
        lastNumber = 1; 
        break; 
      } 
     } 
     System.out.println(decimal); 
     return decimal; 
    } 

    private static int processDecimal(int decimal, int lastNumber, int lastDecimal) { 
     if (lastNumber > decimal) { 
      return lastDecimal - decimal; 
     } else { 
      return lastDecimal + decimal; 
     } 
    } 

    private void validateState(String number){ 
     if (number == null) 
      throw new IllegalArgumentException("Null argument"); 

     if (number.isEmpty()) 
      throw new IllegalArgumentException("Empty string"); 


     if (!number.matches("^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$")) 
      throw new IllegalArgumentException("Invalid Roman number"); 
    } 

    public boolean equals(Object obj) { 
     if ((obj instanceof RomanNumber)) { 
      RomanNumber decimal = (RomanNumber) obj; 
      if (number == decimal.convertToInteger() && number.equals(decimal.convertToInteger)) { 
       return true; 
      } else { 
       return false; 
      } 
     } else { 
      return false; 
     } 
    } 
} 

Спасибо.

+0

Fix what? Что нарушено? – bradimus

+0

Что означает «последний System.out.printl не отвечает»? – khelwood

+0

Вы забыли скобки функции «convertToInteger» в конце этой строки: 'if (number == decimal.convertToInteger() && number.equals (decimal.convertToInteger))' – zockDoc

ответ

0

Ваш первый вопрос

1) Типы операндов Несовместимые Строка и INT

number == decimal.convertToInteger() 

Вы не можете сравнивать строки и Int непосредственно

Вы можете исправить проблему, удалив строку

2) number.equals(decimal.convertToInteger())

Здесь номер, который вы проходите как M. Но decimal.convertToInteger() возвращает 1000

Так что это не подходит для сравнения 2 объекта равны

Как исправить?

public boolean equals(Object obj){ 
    if ((obj instanceof RomanNumber)) { 
     RomanNumber decimal = (RomanNumber)obj; 
     if (number.equals(decimal.number)) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
    else { 
     return false; 
    } 
} 
+0

Правильно! Благодарим вас за объяснение. Я новичок в Java, и я стараюсь улучшаться. – InExperience