2016-08-03 14 views
-1

Ich versuche, meinen Code zu testen, aber die letzte System.out.printl antwortet nicht, warum?Fix Test mit Methode gleich() und überschreiben diese und 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))); 
} 

Wieder ich die equals() Methode der Superklasse Object außer Kraft setzen wollen, habe ich versucht, dies:

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; 
    } 
} 

Schließlich habe ich unter all den Code veröffentlichen, die es macht:

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; 
     } 
    } 
} 

Danke.

+0

Fix was? Was ist kaputt? – bradimus

+0

Was soll "letzte System.out.printl antwortet nicht" bedeuten? – khelwood

+0

Sie haben die Klammern der 'convertToInteger' -Funktion am Ende dieser Zeile vergessen:' if (Zahl == Dezimal.convertToInteger() && Zahl.equals (Dezimal.convertToInteger)) ' – zockDoc

Antwort

0

Ihre erste Frage ist

1) Inkompatible Operandentypen String und int

number == decimal.convertToInteger() 

Sie können nicht String vergleichen und int direkt

Sie Ihr Problem durch das Entfernen der Leitung beheben

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

Hier die Nummer, die Sie als M übergeben. Aber die decimal.convertToInteger() kehrt 1000

diese 2 Objekte für den Vergleich nicht richtig ist also gleich

Wie zu beheben?

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

Das ist richtig! Danke für die Erklärung. Ich bin neu in Java und versuche, besser zu werden. – InExperience

Verwandte Themen