2016-04-20 6 views
0

Ich versuche, dieses Stück Code die tatsächlichen Zahlen und nicht die hexadezimale Position zu drucken.Wie toString() und equals() Methoden geschrieben werden?

public class MoneyDriver 
{ 
    //This is a driver for testing the class 
    public static void main(String[] args) 
    { 
     final int BEGINNING = 500; 
     final Money FIRST_AMOUNT = new Money(10.02); 
     final Money SECOND_AMOUNT = new Money(10.02); 
     final Money THIRD_AMOUNT = new Money(10.88); 

     Money balance = new Money(BEGINNING); 
     System.out.println("The current amount is " + 
     balance.toString()); 
     balance = balance.add(SECOND_AMOUNT); 
     System.out.println("Adding " + SECOND_AMOUNT + 
     " gives " + balance.toString()); 
     balance = balance.subtract(THIRD_AMOUNT); 
     System.out.println("Subtracting " + THIRD_AMOUNT + 
     " gives " + balance.toString()); 



     boolean equal = SECOND_AMOUNT.equals(FIRST_AMOUNT); 
     if(equal) 
     System.out.println(SECOND_AMOUNT + " equals " 
      + FIRST_AMOUNT); 
     else 
     System.out.println(SECOND_AMOUNT.toString() + 
      " does not equal " + FIRST_AMOUNT); 

     equal = THIRD_AMOUNT.equals(FIRST_AMOUNT); 
     if(equal) 
     System.out.println(THIRD_AMOUNT + " equals " + 
      FIRST_AMOUNT); 
     else 
     System.out.println(THIRD_AMOUNT + " does not equal " 
      + FIRST_AMOUNT); 
    } 
} 

Dies ist die Hauptklasse, die von moneydriver genannt wird

public class Money 
{ 
    private long dollars; 
    private long cents; 


    public Money(double amount) 
    { 
    if (amount < 0) 
    { 
     System.out.println(
      "Error: Negative amounts of money are not allowed."); 
     System.exit(0); 
    } 
    else 
    { 
     long allCents = Math.round(amount*100); 
     dollars = allCents/100; 
     cents = allCents%100; 
    } 
    } 

    public Money add(Money otherAmount) 
    { 
    Money sum = new Money(0); 
    sum.cents = this.cents + otherAmount.cents; 
    long carryDollars = sum.cents/100; 
    sum.cents = sum.cents%100; 
    sum.dollars = this.dollars 
       + otherAmount.dollars + carryDollars; 
    return sum; 
    } 

    public Money subtract (Money amount) 
    { 
    Money difference = new Money(0); 
    if (this.cents < amount.cents) 
    { 
     this.dollars = this.dollars - 1; 
     this.cents = this.cents + 100; 
    } 
    difference.dollars = this.dollars - amount.dollars; 
    difference.cents = this.cents - amount.cents; 
    return difference; 
    } 


    public int compareTo(Money amount) 
    { 
    int value; 
    if(this.dollars < amount.dollars) 
    { 
     value = -1; 
    } 
    else if (this.dollars > amount.dollars) 
    { 
     value = 1; 
    } 
    else if (this.cents < amount.cents) 
    { 
     value = -1; 
    } 
    else if (this.cents > amount.cents) 
    { 
     value = 1; 
    } 
    else 
    { 
     value = 0; 
    } 
    return value; 
    } 
} 

Die Ziele ist Methode zu schreiben, ist gleich (auf main Klasse). Die Methode vergleicht die Instanzvariablen des aufrufenden Objekts mit Instanzvariablen des Parameterobjekts für die Gleichheit und gibt True zurück, wenn die Dollar und die Cents des aufrufenden Objekts mit den Dollars und Cents des Parameterobjekts übereinstimmen. Andernfalls wird false zurückgegeben.

Schreiben Sie toString Methode (auf main Klasse). Diese Methode gibt einen String zurück, der wie Geld aussieht, einschließlich des Dollarzeichens. Denken Sie daran, dass Sie, wenn Sie weniger als 10 Cent haben, eine 0 eingeben müssen, bevor Sie die Cent drucken, so dass sie korrekt mit 2 Dezimalstellen erscheint.

Wenn sowohl das Verfahren korrekt

Nach tutorialspoint implementiert ist, sollen Sie entweder

String toString() 
static String toString(int i) 

Aber das mitgelieferte moneydriver bereits die tostring Methode tun, aber das wird nicht angezeigt Zahlen, stattdessen zeigt es eine hexadezimale Position der Variablen an.

Die Equals-Methode wird bereits in moneydriver verwendet, daher bin ich auch etwas verloren.

Die richtige Ausgabe wie dies die aktuelle Menge

aussehen sollte, ist $ 500.00 $ Hinzufügen von 10,02 gibt $ 499,1 $ Subtrahierend $ 510.02 $ 10.88 gibt 10,02 entspricht $ 10.02 $ 10.88 ist nicht gleich $ 10.02

völlig verloren in diesem, dank Hilfe holen.

+0

Sie normalerweise '.toString implementieren würden()' auf dem Objekt, das die 'Money' in diesem Fall wird ausgegeben, Klasse. Dieser Aufruf 'System.out.println (" Der aktuelle Betrag ist "+ balance.toString());' das 'balance' (was eine Instanz von' Money' ist) in einen String konvertiert, benötigt die Methode. Entweder haben Sie missverstanden, was die "Haupt" -Klasse ist, oder es gibt ein großes Problem mit dem Ansatz. – KevinO

+0

@KevinO - öffentliche Klasse Money ist die Hauptklasse –

+0

Implementieren Sie daher (die überschriebene Methode) '.toString()' in der Klasse 'Money'. Wenn Sie in der Treiberklasse 'balance.toString()' aufrufen, ruft sie die Standardmethode für Object auf. – KevinO

Antwort

0

Um eine String Ausgabe auf der Money Klasse zu bekommen, tut so etwas wie:

public class Money 
{ 
    private long dollars; 
    private long cents; 

    // suggested approach for constructor 
    public Money(long amount) throws IllegalArgumentException 
    { 
     if (amount < 0) { 
     throw new IllegalArgumentException("Amount may not be less than 0"); 
     } 

     // do other stuff 
    } 

    ... 

    public String toString() 
    { 
    return String.format("%d.%02d", dollars, cents); 
    } 

    public boolean equals(Object obj) 
    { 
     boolean equal = false; 

     if (obj instanceof Money) { 
     Money chk = (Money)obj; 
     equal = (chk.dollars == this.dollars && 
        chk.cents == this.cents); 
     } 
     return equal; 
    } 
} // end class Money 
+0

Ok danke. Aber wie steht es mit der equals-Methode? Wie kann ich zurückgeben, wenn es gleich oder ungleich ist? öffentliche Boolean gleich (Objekt o) welche Rückleitung sollte ich auf diese Methode schreiben? –

+0

@ Yellow_13, implementieren Sie in der 'Money' Klasse' public boolean equals (Object obj) {...} '. Überprüfen Sie die [Javadocs for Object] (https://docs.oracle.com/javase/8/docs/api/java/lang/Object).html) und [Wie man die equals-Methode in Java überschreibt] (http://stackoverflow.com/questions/8180430/how-to-override-equals-method-in-java). Ich füge ein schnelles Beispiel in die Antwort ein, aber Sie sollten in der Lage sein, die Frage selbst zu beantworten. Beachten Sie, dass es üblich ist, '.hashCode()' beim Überschreiben von '.equals()' zu überschreiben, aber das geht hier nicht weiter. – KevinO

+0

Was macht instanceof? –

Verwandte Themen