Boolean in einer Methode um 2 Objekte zu vergleichen

Krischan

Mitglied
Ich möchte mit einer Methode vergleichen, ob eine Box von den Werten (Breite, Höhe, Länge) in eine andere Box passt.

Java:
class Box
{
    // Variablen
    private double breite;
    private double länge;
    private double höhe;
   
    // Konstruktoen
    Box (double breite, double länge, double höhe)
    {
        this.breite = breite;
        this.länge = länge;
        this.höhe = höhe;
    }
   
    Box (double seite)
    {
        breite = seite;
        länge = seite;
        höhe = seite;
    }
    Box (Box altebox)
    {
        this.breite = altebox.getBreite();
        this.länge = altebox.getLänge();
        this.höhe = altebox.getHöhe();
    }
   
    // Methoden
       
    public double getLänge()
    {
        return länge;
    }
    public double getHöhe()
    {
        return höhe;
    }
    public double getBreite()
    {
        return breite;
    }
   
    public double berechneVolumen()
    {
        return breite * höhe * länge;
    }
    private double berechneOberflaecheVorn()
    {
        return breite * höhe;
    }
    private double berechneOberflaecheOben()
    {
        return breite * länge;
    }
    private double berechneOberflaecheSeitlich()
    {
        return höhe * länge;
    }
   
   
    public double berechneOberflaeche( )
     {
        return 2 * berechneOberflaecheVorn() +
               2 * berechneOberflaecheOben() +
               2 * berechneOberflaecheSeitlich() ;
     }
    public Box großeBox()
    {
        return new Box(1.25*breite, 1.25* länge, 1.25* höhe);
       
    }
    public Box kleineBox()
    {
        return new Box(0.75*breite, 0.75* länge, 0.75* höhe);
    }
    public boolean passtIn (Box äußereBox)
    {
        if (this.breite <  ??? )
        {
            System.out.println("Die Box passt");
            return true;
        }
        System.out.println("Die Box passt nicht");
        return false;
    }
}

class BoxTester
{

  public static void main ( String[] args )
  {
    Box box = new  Box(2.5, 5.0, 6.0 );
   
     System.out.println( "Flaeche: "  + box.berechneOberflaeche( ) +
                         " Volumen: " + box.berechneVolumen( ) );

     System.out.println( "Laenge: " + box.getLänge() +
                         " Hoehe: " + box.getHöhe() +
                         " Breite: " + box.getBreite());
     System.out.println("");
   
     Box boxneu = new Box(box);
   
     System.out.println( "Flaeche: "  + boxneu.berechneOberflaeche( ) +
             " Volumen: " + boxneu.berechneVolumen( ) );

     System.out.println( "Laenge: " + boxneu.getLänge() +
             " Hoehe: " + boxneu.getHöhe() +
             " Breite: " + boxneu.getBreite());
     System.out.println("");
   
     box = box.großeBox();
   
     System.out.println( "Flaeche: "  + box.berechneOberflaeche( ) +
             " Volumen: " + box.berechneVolumen( ) );

     System.out.println( "Laenge: " + box.getLänge() +
             " Hoehe: " + box.getHöhe() +
             " Breite: " + box.getBreite());
     System.out.println("");
   
     boxneu = boxneu.kleineBox();
   
     System.out.println( "Flaeche: "  + boxneu.berechneOberflaeche( ) +
             " Volumen: " + boxneu.berechneVolumen( ) );

     System.out.println( "Laenge: " + boxneu.getLänge() +
             " Hoehe: " + boxneu.getHöhe() +
             " Breite: " + boxneu.getBreite());
     System.out.println("");
   
     boxneu.passtIn(box);
   }
}

Ich hänge an der if Bedingung fest.

Java:
 public boolean passtIn (Box äußereBox)

    {
        if (this.breite <  ??? ())
        {
            System.out.println("Die Box passt");
            return true;
        }
        System.out.println("Die Box passt nicht");
        return false;
}

Ich weiß hier nicht wo ich den richtigen Wert für die "äußereBox" herbekomme. Die Methode getBreite() scheint ja nur den selben Wert wie this.breite zu fiefern wodurch immer false zurückgegeben wird.
 
Du kannst 2 double Variablen nicht mit <, >, == vergleichen. Das führt u.U. nicht zum richtigen Ergebnis. Als Anfänger empfehle ich dir den Umweg über BigDecimal.

Java:
     BigDecimal a = new BigDecimal(...);
     BigDecimal b = new BigDecimal(...);
     a.compareTo(b) == 0;
     a.compareTo(b) > 0;
     a.compareTo(b) < 0;
 
Kannst du das erläutern? Wann führt es denn zum falschen Ergebnis?
BigDecimal wurde in dem Tutorial was ich durcharbeite bisher nicht behandelt. Deshalb gehe ich mal davon aus, dass es damit wahrscheinlich funktioniert (du wirst schon wissen was du schreibst ;-) aber in diesem Fall nicht für die Lösung vorgesehen ist.
 
Du kannst 2 double Variablen nicht mit <, >, == vergleichen. Das führt u.U. nicht zum richtigen Ergebnis. Als Anfänger empfehle ich dir den Umweg über BigDecimal.

Java:
     BigDecimal a = new BigDecimal(...);
     BigDecimal b = new BigDecimal(...);
     a.compareTo(b) == 0;
     a.compareTo(b) > 0;
     a.compareTo(b) < 0;
Wieso? Ich sehe in dem Beispiel kein Problem.
 
Wieso? Ich sehe in dem Beispiel kein Problem
Ich auch nicht.

Aber wann passt eine Box in eine andere? Wenn jeweils Länge,Breite,Höhe sortiert kleiner oder größer ist

Beweis:
Sei l1,b1,h1,l2,b2,h2, wobei l1>b1>h1 und l2>b2>h2.
Wenn h1 < h2 dann gilt auch h1 < b2 und h1 < l2 (Transitivität).
Wenn b1 < b2 analog.
Wenn l1 < l2 trivial.
h1 !< h2 ^ b1 !< b2 ^ b1 !< b2 muss gelten, wenn eine Box in eine andere passt.
 
Kannst du das erläutern? Wann führt es denn zum falschen Ergebnis?
Es geht um Rundungsfehler, die allerdings nur eine Rolle spielen, wenn gerechnet wird -> hier also irrelevant.

Das ist wie im Dezimalen: rechnerisch wäre 1/3 + 1/3 + 1/3 == 1. Da Du aber zur Darstellung von 1/3 nicht ausreichend viele Dezimalstellen zur Verfügung hast, wird gerundet, so dass plötzlich 1/3 + 1/3 + 1/3 < 1 gilt. Genau das gleiche passiert bei double auch: 0,1 (dezimal) lässt sich binär nicht exakt darstellen und muss daher gerundet werden. Addierst Du zehnmal 0,1, gilt für das Ergebnis, dass es kleiner als 1 ist:

Java:
public class Test {
    public static void main(String[] args) {
        double a = 0;
        for (int i = 0; i < 10; i++) { a += 0.1; }
        if (a < 1.0) {
            System.out.printf("%f < 1.0\n", a);
        }
    }
}
 
Du kannst 2 double Variablen nicht mit <, >, == vergleichen. Das führt u.U. nicht zum richtigen Ergebnis. Als Anfänger empfehle ich dir den Umweg über BigDecimal.
Als Anfänger befasst man sich nicht unbedingt mit Rundungsfehlern. Hier geht es in erster Linie um Objektorientierung. Dafür sollte double ausreichend sein.
Außerdem kommt bei einem Vergleich von 2 double Werten die Rundungsproblematik gar nicht zu tragen.
Java:
if (breite <  äußereBox.getBreite() )
 
Es funktioniert einfach nicht:
Java:
public final class Test {

    static class Box {

        private double breite;
        private double länge;
        private double höhe;

        Box(double breite, double länge, double höhe) {
            this.breite = breite;
            this.länge = länge;
            this.höhe = höhe;
        }

        public boolean passtIn(Box äußereBox) {
            if (this.breite < äußereBox.breite) {
                System.out.println("Die Box passt");
                return true;
            }
            System.out.println("Die Box passt nicht");
            return false;
        }

    }

    public static void main(String[] args) throws Exception {

        double a = 1d;
        double b = 0d;
        for (int i = 0; i < 10; i++) {
            b += 0.1;
        }
       
        Box box1 = new Box(a, 1d, 1d);
        Box box2 = new Box(b, 1d, 1d);
       
        System.out.println(box2.passtIn(box1)); // funktioniert nicht
    }

}
 
Zuletzt bearbeitet:
Als Anfänger befasst man sich nicht unbedingt mit Rundungsfehlern. Hier geht es in erster Linie um Objektorientierung. Dafür sollte double ausreichend sein.
Außerdem kommt bei einem Vergleich von 2 double Werten die Rundungsproblematik gar nicht zu tragen.
Java:
if (breite <  äußereBox.getBreite() )
Es geht ja auch gar nicht um Rundung.
 
Du kreierst ein Problem das in seinem Fall nicht existiert/irrelevant ist. Einem Anfänger zu BigDecimal statt double zu raten ist in seinem Fall unsinn.
 

Zurück
Oben