Erste Schritte Berechnung des Paketportos - Problem/Frage

Serano11

Mitglied
Abend,

ich habe ein Problem bei der folgenden Aufgabe

Hinweis: Angaben sind in int Milimeter und Gram, Euro in double

"
......( alles davor funktioniert und habe ich gemacht aber das Gurtmaß bereitet mir Probleme )
• Paket bis 120x60x60 und max. Gurtmaß (=L + 2xB + 2xH) <= 300cm und bis 5kg: 5,99 EUR
• Paket bis 120x60x60 und max. Gurtmaß (=L + 2xB + 2xH) <= 300cm und bis 10kg: 7,99 EUR"
• Paket bis 120x60x60 und bis 31,5kg: 14,99 EUR

und zwar habe ich folgendes:
".....
} else if ((pack.length <= 1200) && (pack.width <= 600) && (pack.height <= 600) &&
((pack.length + (2 * pack.width) + (2 * pack.height) ) <= 300) && (pack.weight <= 5000)) {
shippingCosts = 5.99;

} else if ((pack.length <= 1200) && (pack.width <= 600) && (pack.height <= 600)
&& ((pack.length + (2 * pack.width) + (2 * pack.height) ) <= 300) && (pack.weight <= 10000 ) {
shippingCosts = 7.99;

} else {
shippingCosts = 14.99;
}
return shippingCosts;

}

}
"
Entschuldigt, wenn der Code schlecht dargestellt wird.

Mein Problem ist, dass es den Schritt zu 5,99€ einfach überspringt. Es fehlen Befehle aber ich weiß nicht welche. Edit: Ich verstehe, was und wo mein Fehler ist, lediglich die Lösung für den "Max. Gurtmaß" finde ich nicht.

Könntet ihr mir bitte helfen? Ich komme echt nicht weiter.

Grüße

Anmerkung: Bei Fehlern entschuldige ich mich ( wie falsches Thema o.ä. ).
 
Zuletzt bearbeitet:

Serano11

Mitglied
Mit welchen Input-Daten ?

Sind damit die Eingabe-daten gemeint? ( sorry, wenn ich eine dumme Frage ist, wie gesagt, bin Anfänger )
Weil eine Eingabe Möglichkeit ist vorhanden, da eine GUI erstellt wurde.

Edit: Eine weitere Frage: Ich habe beim GUI nun einen Button für Exit erstellt aber wie heißt der Befehl, dass beim Klicken des Buttons, das Fenster tatsächlich schließt?
 

Serano11

Mitglied
Das hier?:


public class Packet {

// length of package in millimeters
public int length;

// width of package in millimeters
public int width;

// height of package in millimeters
public int height;

// weight of package in grams
public int weight;

// constructor
public Packet(int length, int width, int height, int weight) {
this.length = length;
this.width = width;
this.height = height;
this.weight = weight;
}
 
X

Xyz1

Gast
• Paket bis 120x60x60 und max. Gurtmaß (=L + 2xB + 2xH) <= 300cm und bis 5kg: 5,99 EUR
• Paket bis 120x60x60 und max. Gurtmaß (=L + 2xB + 2xH) <= 300cm und bis 10kg: 7,99 EUR"
• Paket bis 120x60x60 und bis 31,5kg: 14,99 EUR
Mir fällt da auf, dass nur nach kg vergleicht werden muss......
(120x60x60 gleich, Gurtmaß insofern verstanden auch)
 

Serano11

Mitglied
Nein, ;);) welche Werte hat das Paket (Länge, Breite, Höhe etc) bei deinem Test wo du sagst es ergibt immer 14,99€
Ah entschuldige :)

Bei den Werten

- 250x150x90mm und 790 gramm = 3,89€
- 450x250x125mm und 1500 gramm = 4,39€ <- bis hier hin funktioniert es.

Mit den Werten

- 1200x600x600mm und 5000 gramm = 14,99€

- Die 7,99€ wird ignoriert.

Liegt es an "((pack.length + (2 * pack.width) + (2 * pack.height) ) <= 300) "?

Edit:
DerWissende:

Wie kann ich es am Besten vergleichen lassen?
 
Zuletzt bearbeitet:

JStein52

Top Contributor
Wie ist es mit der letzten Bedingung " <= 31500 gram "
Nun ja ... die fragst du ja nicht explizit ab sondern alles was bei den vorigen Vergleichen durchfällt kostet dann bei dir 14,99 € Du hast aber auch oben nicht gesagt was mit Paketen ist die grösser sind bzw. die schwerer als 31,5 kilo sind. Das müsstest du dir noch "ausdenken" und evtl. deien Abfragen erweitern.
Und duzen ist natürlich ok und hier üblich.
 

Serano11

Mitglied
Nun ja ... die fragst du ja nicht explizit ab sondern alles was bei den vorigen Vergleichen durchfällt kostet dann bei dir 14,99 € Du hast aber auch oben nicht gesagt was mit Paketen ist die grösser sind bzw. die schwerer als 31,5 kilo sind. Das müsstest du dir noch "ausdenken" und evtl. deien Abfragen erweitern.
Und duzen ist natürlich ok und hier üblich.

Danke dir.

ich habe es probiert mit:

} else if ((pack.length <= 1200) && (pack.width <= 600) && (pack.height <= 600)
&& ((pack.length + (2 * pack.width) + (2 * pack.height) ) <= 3000) && pack.weight >= 10000 && pack.weight <= 31500 ) {
shippingCosts = 14.99;
} else {
shippingCosts = 0;
}

Aber die "0" wäre jedoch falsch?

oder eine If-Bedingung, die per Println (" Paketgewicht zu hoch, wir führen keine Pakete mit einem Gewicht höher als 31,5 Kg!" ) o.ä.?
 
X

Xyz1

Gast
@Serano11 :
Java:
class Paket {
    public static void main(String[] args) {
        Random ra = new Random(0);
        for (int i = 0; i < 20; i++) {
            Paket pa = new Paket(ra.nextInt(130), ra.nextInt(60), ra.nextInt(60), ra.nextFloat() * 32);
            System.out.println(pa + "\t"+ pa.preis() );
        }
    }
    enum Preis {
        K(5.99), M(7.99), G(14.99), UNDEFINED(-1);
        private final double p;
        private Preis(double p) {
            this.p = p;
        }
        @Override
        public String toString() {
            return "Preis{" + "p=" + p + '}'; // hier ne schöne Ausgabe
        }
    }
    int L, B, H;
    float kg;
    public Paket(int L, int B, int H, float kg) {
        this.L = L;
        this.B = B;
        this.H = H;
        this.kg = kg;
    }
    int gurtmass() {
        return L + B + B + H + H;
    }
    Preis preis() {
        if (L <= 120 && B <= 60 && H <= 60) {
            if (gurtmass() <= 300) {
                if (kg <= 5) {
                    return Preis.K;
                } else if (kg <= 10) {
                    return Preis.M;
                } else if (kg <= 31.5) {
                    return Preis.G;
                } else {
                    return Preis.UNDEFINED;
                }
            } else {
                return Preis.G;
            }
        } else {
            return Preis.UNDEFINED;
        }
    }
    @Override
    public String toString() {
        return "Paket{" + "L=" + L + ", B=" + B + ", H=" + H + ", kg=" + kg + '}';
    }
}

Die Ausgabe schon gut:
Code:
Paket{L=70, B=28, H=49, kg=19.403046}	Preis{p=14.99}
Paket{L=65, B=53, H=11, kg=3.7442112}	Preis{p=5.99}
Paket{L=29, B=14, H=17, kg=8.088837}	Preis{p=7.99}
Paket{L=73, B=22, H=35, kg=31.450224}	Preis{p=14.99}
Paket{L=44, B=15, H=41, kg=5.631256}	Preis{p=7.99}
Paket{L=53, B=48, H=44, kg=11.775223}	Preis{p=14.99}
Paket{L=12, B=40, H=3, kg=0.04437256}	Preis{p=5.99}
Paket{L=62, B=23, H=5, kg=18.014389}	Preis{p=14.99}
Paket{L=77, B=47, H=2, kg=9.1489525}	Preis{p=7.99}
Paket{L=75, B=53, H=58, kg=31.25433}	Preis{p=14.99}
Paket{L=70, B=55, H=35, kg=27.765717}	Preis{p=14.99}
Paket{L=128, B=51, H=34, kg=18.241096}	Preis{p=-1.0}
Paket{L=32, B=42, H=19, kg=13.190968}	Preis{p=14.99}
Paket{L=26, B=6, H=27, kg=31.509571}	Preis{p=-1.0}
Paket{L=28, B=17, H=3, kg=5.951668}	Preis{p=7.99}
Paket{L=27, B=28, H=25, kg=21.47444}	Preis{p=14.99}
Paket{L=48, B=57, H=31, kg=11.49329}	Preis{p=14.99}
Paket{L=118, B=18, H=38, kg=21.339178}	Preis{p=14.99}
Paket{L=17, B=11, H=26, kg=26.11}	Preis{p=14.99}
Paket{L=67, B=42, H=55, kg=29.835777}	Preis{p=14.99}

Ich habe aber das Gefühl, wenn es nicht gegurtmaßt ist, noch etwas vergessen zu haben - (wenn es besonders schwer ist).
Also der Paketträger wäre vielleicht bezüglich des Gewichts übernachteilt.......
 
X

Xyz1

Gast
Überarbeitet:
Java:
/*
• Paket bis 120x60x60 und max. Gurtmaß (=L + 2xB + 2xH) <= 300cm und bis 5kg: 5,99 EUR
• Paket bis 120x60x60 und max. Gurtmaß (=L + 2xB + 2xH) <= 300cm und bis 10kg: 7,99 EUR"
• Paket bis 120x60x60 und bis 31,5kg: 14,99 EUR
 */
class Paket {

    public static void main(String[] args) {
        Random ra = new Random(0);
        for (int i = 0; i < 20; i++) {
            Paket pa = new Paket(ra.nextInt(130), ra.nextInt(60), ra.nextInt(60), ra.nextFloat() * 32);
            System.out.println(pa + "\t" + pa.preis());
        }
    }

    enum Preis {
        K(5.99), M(7.99), G(14.99), UNDEFINED(-1);
        private final double p;

        private Preis(double p) {
            this.p = p;
        }

        @Override
        public String toString() {
            return "Preis{" + "p=" + p + '}'; // hier ne schöne Ausgabe
        }
    }
    int L, B, H;
    float kg;

    public Paket(int L, int B, int H, float kg) {
        this.L = L;
        this.B = B;
        this.H = H;
        this.kg = kg;
    }

    int gurtmass() {
        return L + B + B + H + H;
    }

    Preis preis() {
        int g = gurtmass();
        if (L <= 120 && B <= 60 && H <= 60) {
            if (kg <= 5) {
                if (g <= 300) {
                    return Preis.K;
                } else {
                    return Preis.G;
                }
            } else if (kg <= 10) {
                if (g <= 300) {
                    return Preis.M;
                } else {
                    return Preis.G;
                }
            } else if (kg <= 31.5) {
                // das Grutmas hier nicht mehr wichtig
                // schwer
                return Preis.G;
            } else {
                // zu schwer
                return Preis.UNDEFINED;
            }
        } else {
            // Mase ueberschritten
            return Preis.UNDEFINED;
        }
    }

    @Override
    public String toString() {
        return "Paket{" + "L=" + L + ", B=" + B + ", H=" + H + ", kg=" + kg + '}';
    }
}

Code:
Paket{L=70, B=28, H=49, kg=19.403046}	Preis{p=14.99}
Paket{L=65, B=53, H=11, kg=3.7442112}	Preis{p=5.99}
Paket{L=29, B=14, H=17, kg=8.088837}	Preis{p=7.99}
Paket{L=73, B=22, H=35, kg=31.450224}	Preis{p=14.99}
Paket{L=44, B=15, H=41, kg=5.631256}	Preis{p=7.99}
Paket{L=53, B=48, H=44, kg=11.775223}	Preis{p=14.99}
Paket{L=12, B=40, H=3, kg=0.04437256}	Preis{p=5.99}
Paket{L=62, B=23, H=5, kg=18.014389}	Preis{p=14.99}
Paket{L=77, B=47, H=2, kg=9.1489525}	Preis{p=7.99}
Paket{L=75, B=53, H=58, kg=31.25433}	Preis{p=14.99}
Paket{L=70, B=55, H=35, kg=27.765717}	Preis{p=14.99}
Paket{L=128, B=51, H=34, kg=18.241096}	Preis{p=-1.0}
Paket{L=32, B=42, H=19, kg=13.190968}	Preis{p=14.99}
Paket{L=26, B=6, H=27, kg=31.509571}	Preis{p=-1.0}
Paket{L=28, B=17, H=3, kg=5.951668}	Preis{p=7.99}
Paket{L=27, B=28, H=25, kg=21.47444}	Preis{p=14.99}
Paket{L=48, B=57, H=31, kg=11.49329}	Preis{p=14.99}
Paket{L=118, B=18, H=38, kg=21.339178}	Preis{p=14.99}
Paket{L=17, B=11, H=26, kg=26.11}	Preis{p=14.99}
Paket{L=67, B=42, H=55, kg=29.835777}	Preis{p=14.99}

Action findet in der Methode preis() statt. Methode preis() könnte optimiert werden. Stelle einfach einen Entscheidungsbaum auf. - Was sagt @JStein52 dazu?
 

JStein52

Top Contributor
Ich würde sagen, preis() so lassen wie du sie jetzt hast. Ist doch übersichtlich und verständlich. Wenn du jetzt mit Entscheidungsbäumen anfängst verwirrt es nur und macht das einfache Problem wieder unübersichtlich.
 

mrBrown

Super-Moderator
Mitarbeiter
Action findet in der Methode preis() statt. Methode preis() könnte optimiert werden. Stelle einfach einen Entscheidungsbaum auf. - Was sagt @JStein52 dazu?
Alternativ so ;):


Java:
import java.util.Random;
import java.util.function.Predicate;

/*
* Paket bis 120x60x60 und max. Gurtmaß (=L + 2xB + 2xH) <= 300cm und bis 5kg: 5,99 EUR
* Paket bis 120x60x60 und max. Gurtmaß (=L + 2xB + 2xH) <= 300cm und bis 10kg: 7,99 EUR
* Paket bis 120x60x60 und bis 31,5kg: 14,99 EUR
*/
class Paket {

    public static void main(String[] args) {
        Random ra = new Random(0);
        for (int i = 0; i < 20; i++) {
            Paket pa = new Paket(ra.nextInt(130), ra.nextInt(60), ra.nextInt(60), ra.nextFloat() * 32);
            System.out.println(pa + "\t" + pa.preis());
        }
    }

    enum Preis implements Predicate<Paket> {
        K(5.99) {
            /**
             * Prüft, ob die Größe des Paket für diesen Preis gültig ist.
             */
            @Override
            public boolean test(final Paket paket) {
                return (paket.L <= 120 && paket.B <= 60 && paket.H <= 60)
                        && (paket.kg <= 5) && (paket.gurtmass() <= 300);
            }
        }, M(7.99) {
            @Override
            public boolean test(final Paket paket) {
                return (paket.L <= 120 && paket.B <= 60 && paket.H <= 60)
                        && (paket.kg <= 10) && (paket.gurtmass() <= 300);
            }
        }, G(14.99) {
            @Override
            public boolean test(final Paket paket) {
                return (paket.L <= 120 && paket.B <= 60 && paket.H <= 60) && (paket.kg <= 31.5);
            }
        }, UNDEFINED(-1) {
            @Override
            public boolean test(final Paket paket) {
                return true;
            }
        };

        private final double p;

        private Preis(double p) {
            this.p = p;
        }

        @Override
        public String toString() {
            return "Preis{" + "p=" + p + '}'; // hier ne schöne Ausgabe
        }


    }

    int L, B, H;
    float kg;

    public Paket(int L, int B, int H, float kg) {
        this.L = L;
        this.B = B;
        this.H = H;
        this.kg = kg;
    }

    int gurtmass() {
        return L + B + B + H + H;
    }

    Preis preis() {
        for (final Preis preis : Preis.values()) {
            if (preis.test(this)) {
                return preis;
            }
        }
        return Preis.UNDEFINED;
    }

    @Override
    public String toString() {
        return "Paket{" + "L=" + L + ", B=" + B + ", H=" + H + ", kg=" + kg + '}';
    }
}
 

Javinner

Top Contributor
Ich gebe mal mein Senf dazu und weil hier schon Code gepostet wurde, lege ich meine Idee offen.

edit: die Preise habe ich frei erfunden.
Java:
public class Versandstation
{

    public static void main(String[] args)
    {

        Paket[] pakets = new Paket[5];
        pakets[0] = new Paket(Paketmasse.MAX_60_x_30_x_15, Paketgewicht.MAX_2Kg, true);
        pakets[1] = new Paket(Paketmasse.MAX_120_x_60_x60, Paketgewicht.MAX_5Kg, false);
        pakets[2] = new Paket(Paketmasse.MAX_60_x_30_x_15, Paketgewicht.MAX_10Kg, true);
        pakets[3] = new Paket(Paketmasse.MAX_120_x_60_x60, Paketgewicht.MAX_31_5Kg, true);
        pakets[4] = new Paket(Paketmasse.MAX_120_x_60_x60, Paketgewicht.MAX_31_5Kg, false);

        //Info ueber alle Pakete;
        for (Paket paket : pakets) {
            System.out.println(paket.toString());
        }
    }
}

/** Konsolenausgabe */
run:
[Paketgroesse: MAX_60_x_30_x_15][Paketgewicht: MAX_2Kg][Inland: true]Paketkosten: 4.99]
[Paketgroesse: MAX_120_x_60_x60][Paketgewicht: MAX_5Kg][Inland: false]Paketkosten: 16.99]
[Paketgroesse: MAX_60_x_30_x_15][Paketgewicht: MAX_10Kg][Inland: true]Paketkosten: 16.99]
[Paketgroesse: MAX_120_x_60_x60][Paketgewicht: MAX_31_5Kg][Inland: true]Paketkosten: 45.0]
[Paketgroesse: MAX_120_x_60_x60][Paketgewicht: MAX_31_5Kg][Inland: false]Paketkosten: 54.0]
BUILD SUCCESSFUL (total time: 0 seconds)
Java:
final class Paket
{

    /**
     * prueft, ob das Paket im Inland versendet werden soll;
     */
    private boolean inland;
    /**
     * Versandkosten des jeweiligen Paketes;
     */

    private final double kosten;
    /**
     * dient rein zu Informationszwecken, siehe {@code toString}
     */

    private final Object[] info;

    /**
     * initialisiert ein Konstruktor mit: berechnet die Kosten fuer jedes Paket
     * anhand der mitgelierten Informationen ueber die Paketmasse, Paketgewicht
     * und Lieferort des Paketes;
     *
     * @param pm Paketmasse (L x B x H)
     * @param pg Paketgewicht
     * @param inland {@code inland} true Inland/ false Ausland
     */
    Paket(Paketmasse pm, Paketgewicht pg, boolean inland)
    {
        this.kosten = berechneKosten(pm, pg, inland);
        this.info = getInfo(pm, pg, inland);
    }

    /**
     * liefert {@code kosten} des jeweiligen Paketes;
     *
     * @return {@code kosten} Versandkosten fuer das Paket
     */
    protected double getKosten()
    {
        return this.kosten;
    }

    /**
     * berechnet die Kosten fuer das jeweilige Paket;
     *
     * @param pm Paketmasse (L x B x H)
     * @param pg Paketgewicht
     * @param inland {@code inland} true Inland/ false Ausland
     *
     * @return {@code kosten} Versandkosten fuer das Paket;
     */
    private double berechneKosten(Paketmasse pm, Paketgewicht pg, boolean inland)
    {
        switch (pg) {
            case MAX_2Kg:
                switch (pm) {
                    case MAX_60_x_30_x_15:
                        return inland ? 4.99 : 8.99;
                    default:
                        return inland ? 8.99 : 10.99;
                }
            case MAX_5Kg:
                switch (pm) {
                    case MAX_60_x_30_x_15:
                        return inland ? 10.99 : 12.99;
                    default:
                        return inland ? 12.99 : 16.99;
                }
            case MAX_10Kg:
                switch (pm) {
                    case MAX_60_x_30_x_15:
                        return inland ? 16.99 : 21.99;
                    default:
                        return inland ? 21.99 : 25.99;
                }
            case MAX_31_5Kg:
                switch (pm) {
                    case MAX_60_x_30_x_15:
                        return inland ? 25.99 : 45;
                    default:
                        return inland ? 45 : 54;
                }
            default:
                return 0;
        }
    }

    /**
     * speichert die Informationen fuer das jeweilige Paket;
     *
     * @param pm Paketmasse (L x B x H)
     * @param pg Paketgewicht
     * @param inland {@code inland} Inland/Ausland
     *
     * @return {@code info} Information des Paketes, siehe {@code toString};
     */
    private Object[] getInfo(Paketmasse pm, Paketgewicht pg, boolean inland)
    {
        Object[] o = new Object[3];
        o[0] = pm;
        o[1] = pg;
        o[2] = inland;
        return o;
    }

    @Override
    public String toString()
    {
        return "[Paketgroesse: " + this.info[0] + "]" + "[Paketgewicht: " + this.info[1] + "]" + "[Inland: " + this.info[2] + "]" + "Paketkosten: " + this.getKosten() + "]";
    }

}
Java:
enum Paketgewicht
{
    MAX_2Kg, MAX_5Kg, MAX_10Kg, MAX_31_5Kg;
}
Java:
 enum Paketmasse
{
    MAX_60_x_30_x_15, MAX_120_x_60_x60;
}
 
Zuletzt bearbeitet:

Javinner

Top Contributor
geschachtelte switch? ist ja abartig... ;)
Wie viele Stellen müsstest du ändern, wenn es ein zusätzliches Maß oder Gewicht gibt oder sich der Auslandsaufschlag ändert?
Natürlich ist es nicht perfekt und keine Musterlösung. Da ich selbst, wie ich dir ständig beweise, ein Anfänger bin, ist es jedenfalls auch nur eine sehr begrenzte Anfängerlösung, welche jedoch den Zweck hat, eine andere Möglichkeit aufzuzeigen. Und eins steht fest: meine Vorschläge werden (hoffentlich) mit der Zeit deinen Anforderungen genügen. Für den Moment erfreue ich mich daran, dass die Lösung,
so unvollkommen die auch sein mag, mich vom Lesen der Aufgabe bis zum erstellen des Programms keine 30 Minuten gekostet hat.
Da du aber selbst weiß, dass der Weg ein langer ist, bitte ich um Nachsicht und natürlich eine Alternative nebst der Kritik ;)
 

mrBrown

Super-Moderator
Mitarbeiter
Natürlich ist es nicht perfekt und keine Musterlösung. Da ich selbst, wie ich dir ständig beweise, ein Anfänger bin, ist es jedenfalls auch nur eine sehr begrenzte Anfängerlösung, welche jedoch den Zweck hat, eine andere Möglichkeit aufzuzeigen. Und eins steht fest: meine Vorschläge werden (hoffentlich) mit der Zeit deinen Anforderungen genügen. Für den Moment erfreue ich mich daran, dass die Lösung,
so unvollkommen die auch sein mag, mich vom Lesen der Aufgabe bis zum erstellen des Programms keine 30 Minuten gekostet hat.
Da du aber selbst weiß, dass der Weg ein langer ist, bitte ich um Nachsicht und natürlich eine Alternative nebst der Kritik ;)
So bös war das auch nicht gemeint, ich wollte nur Hinweise geben, in welche Richtung man das verbessern kann - da bringt ne passende Frage meist mehr, als einfach eine Lösung hinklatschen ;)
 

Javinner

Top Contributor
mrBrown hat gesagt.:
So bös war das auch nicht gemeint
ich wollte nur Hinweise geben, in welche Richtung man das verbessern kann - da bringt ne passende Frage meist mehr, als einfach eine Lösung hinklatschen
Habe es nicht negativ aufgefasst, alles ist gut :)
Das stimmt schon. Ich habe mir überlegt, ob ich es umfangreich mache, dann wäre aber die Übersicht verloren gegangen. Letztendlich wollte ich die Nützlichkeit von Enum hervorheben und die Vorteile hervorheben.
Aber du hast ja auch recht, wenn es darum geht, dass meine Lösung
nicht pflegeleicht ist. Bin bei Generics angekommen und musste bei der Aufgabe daran denken, dass man hier wohl besser Map nehmen sollte. Bin aber noch nicht soweit, daher habe ich es gelassen.
 

mrBrown

Super-Moderator
Mitarbeiter
Habe es nicht negativ aufgefasst, alles ist gut :)
Das stimmt schon. Ich habe mir überlegt, ob ich es umfangreich mache, dann wäre aber die Übersicht verloren gegangen. Letztendlich wollte ich die Nützlichkeit von Enum hervorheben und die Vorteile hervorheben.
Aber du hast ja auch recht, wenn es darum geht, dass meine Lösung
nicht pflegeleicht ist. Bin bei Generics angekommen und musste bei der Aufgabe daran denken, dass man hier wohl besser Map nehmen sollte. Bin aber noch nicht soweit, daher habe ich es gelassen.
Enums sind schon das passendere ;)
Aber grad Switch und enum kann man wunderbar anders schreiben - eben in dem man das Verhalten in die Enums auslagert, dann spart man sich das Switch-Statement und hat gleichzeitig Daten und Funktion näher zusammen gebracht.
 

Javinner

Top Contributor
So in etwa dann?
Java:
public enum SuperEnum
{
   
    INLAND_MAX_60_x_30_x_15_BIS_2KG, 
    AUSLAND_MAX_60_x_30_x_15_BIS_2KG;

    private final double inland_preis_MAX_60_x_30_x_15_BIS_2KG = 4.99;
    private final double ausland_preis_MAX_60_x_30_x_15_BIS_2KG = 6.99;

    protected double getPreis()
    {
        switch (this) {
            case INLAND_MAX_60_x_30_x_15_BIS_2KG:
                return inland_preis_MAX_60_x_30_x_15_BIS_2KG;
            case AUSLAND_MAX_60_x_30_x_15_BIS_2KG:
                return ausland_preis_MAX_60_x_30_x_15_BIS_2KG;
                /** Und so weiter und so fort */
            default:
                return 0;
        }
    }
}
 

mrBrown

Super-Moderator
Mitarbeiter
Enums selbst können Methoden und Attribute haben ;)
Guck mal in mein Beispiel weiter oben, da haben die Enums zB eine Methode, ob die Pakete zu ihrer Kategorie gehören.
So ähnlich kann man es auch für den Preis machen
 
X

Xyz1

Gast
lege ich meine Idee offen
Das ist auch ganz schön, allerdings:
Paketmasse.MAX_60_x_30_x_15
hast du das frei erfunden(?) und in Kategorien eingeteilt? Man kann bei der Post mWn auch Pakete beliebiger Maße verschicken und eine Waage ist auch immer dabei. Ebenso wird ein Auge zugedrückt, wenn ein Paket zum Besenstiel 31,51kg schwer ist.

Übertrieben wäre es, wenn man für Paket noch eine Factory hätte.

mWn.... mhm.... sind Enums mehr oder weniger Konstanten. Ich nicht genau, ob die Logik unbedingt bei den Daten sein muss - zumal die enum bereits Bestandteil der Klasse Paket ist.
 

Javinner

Top Contributor
@DerWissende
War einer DHL-Pakettabelle entnommen, ob diese noch aktuell ist, spielte für mich keine Rolle, da es hier nur um eine Übung ging.
Meine Lösung entspricht so auch nicht ganz der Aufgabe, da ja genaues Gewicht, bzw. Abmaße gefordert werden. Letztendlich
wollte ich einem Anfänger von einem Anfänger eine weitere Idee vermitteln. Da gibt es sicher bessere Lösungen.
 
X

Xyz1

Gast
Meine Lösung entspricht so auch nicht ganz der Aufgabe, da ja genaues Gewicht, bzw. Abmaße gefordert werden. Letztendlich
Entspricht gar nicht der Aufgabe....
Es ist auch richtig, dass der findige Mitarbeiter durch bloßes sehen und anschließendes wiegen, weiß, um welches Paket es sich handelt. Dennoch wirds so einen Calkulator geben.
 

mrBrown

Super-Moderator
Mitarbeiter
mWn.... mhm.... sind Enums mehr oder weniger Konstanten. Ich nicht genau, ob die Logik unbedingt bei den Daten sein muss - zumal die enum bereits Bestandteil der Klasse Paket ist.
Enums sind schon Konstanten, aber eben auch mehr als nur Konstanten.

Und das Logik und Daten zusammen gehören, ist doch eins der Prinzipen von Objekt-Orientiertheit...
 

Serano11

Mitglied
Hui, das Thema ist ja explodiert :D Vielen Dank für all die Antworten und Lösungsvorschläge :)

Edit: Welche Befehle gibt es, um einen Exit Button auf einem GUI funtionstüchtig zu machen? Den Button erstellte ich auf dem GUI, doch er funktioniert nicht, da ich keine Anweisung habe.
 

temi

Top Contributor
Weil es hier gerade so schön ist, mein Ansatz:
Java:
import java.util.ArrayList;
import java.util.Random;

public class Paket
{
    private int l;
    private int b;
    private int h;
    private float kg;
    private static ArrayList<PackageUnit> packages = new ArrayList<>();

    public Paket(int l, int b, int h, float kg)
    {
        this.l = l;
        this.b = b;
        this.h = h;
        this.kg = kg;
    }

    public static void main(String[] args)
    {
        addPackage(new PackageUnit(120, 60, 60, 300, 5f, 5.99f));
        addPackage(new PackageUnit(120, 60, 60, 300, 10f, 7.99f));
        addPackage(new PackageUnit(120, 60, 60, Integer.MAX_VALUE, 31.5f, 14.99f));

        Random ra = new Random(0);
        for (int i = 0; i < 20; i++) {
            Paket pa = new Paket(ra.nextInt(130), ra.nextInt(60), ra.nextInt(60), ra.nextFloat() * 32);

            System.out.println(pa + "\t" + pa.getPrice(pa));
        }
    }

    public static void addPackage(PackageUnit p)
    {
        packages.add(p);
    }

    public int calcGurtmass()
    {
        return l + b + b + h + h;
    }

    public float getPrice(Paket p)
    {
        for(final PackageUnit pu : packages)
        {
            if (pu.test(p))
            {
                return pu.getPrice();
            }
        }

        return 0;
    }

    public int getL()
    {
        return l;
    }

    public int getB()
    {
        return b;
    }

    public int getH()
    {
        return h;
    }

    public float getKg()
    {
        return kg;
    }

    @Override
    public String toString() {
        return "Paket{" + "L=" + l + ", B=" + b + ", H=" + h + ", kg=" + kg + '}';
    }

public class PackageUnit
{
    private final int maxL;
    private final int maxB;
    private final int maxH;
    private final int maxG;
    private final float maxKg;
    private final float price;

    public PackageUnit(int maxL, int maxB, int maxH, int maxG, float maxKg, float price)
    {
        this.maxL = maxL;
        this.maxB = maxB;
        this.maxH = maxH;
        this.maxG = maxG;
        this.maxKg = maxKg;
        this.price = price;
    }

    public boolean test(Paket p)
    {
        return p.getL() <= maxL && p.getB() <= maxB && p.getH() <= maxH && p.getKg() <= maxKg && p.calcGurtmass() <= maxG;
    }

    public float getPrice()
    {
        return price;
    }
}
}

Gibt noch Optimierungsbedarf, aber ich hab grad keine Zeit mehr dazu...
 

Serano11

Mitglied
Handelt es sich um eine Swing-GUI ? Hast du für den Exit-Button einen ActionListener registriert ?

Sie wurde im Eclipse erstellt und ich kann sie im Eclipse aufrufen. Ich habe es versucht aber ich weiß nicht, wie die Anweisung/Befehl hierfür heißt :( und nach Recherche habe ich es trotzdem nicht verstanden.. Ich dachte, ich konnte das Gegenteil für " openProjectButton.setOnAction(e -> ProjectHandling.openProject()); " mit "exitProjectButton.setOnAction(e -> ProjectHandling.exitProject());" machen, war aber falsch :rolleyes:

Danke für die HIlfe nochmals !
 

mrBrown

Super-Moderator
Mitarbeiter
Das geht in die richtige Richtung, es muss halt nur die Funktion zum schließen geben...

Willst du das ganze Programm beenden?
 

Serano11

Mitglied
Vielen Dank, ich habe den Befehl:

"exitButton.setOnAction(e -> System.exit(1));"

genutzt und es funktioniert. Ich drücke den Exit Button und er beendet es :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I File Uploader... Statusanzeige, Berechnung des Status etc. Java Basics - Anfänger-Themen 0
Bugs Bunny Fehlerhafte Berechnung beim erneuten Durchlaufen der Schleife Java Basics - Anfänger-Themen 5
Jamie logische Verknüpfung zur Schaltjahr-Berechnung Java Basics - Anfänger-Themen 30
Stephan_kl Reihenwert-Berechnung, Ergebnis mit vorherigem Ergebnis vergleichen Java Basics - Anfänger-Themen 11
Abraham42 Berechnung der Kühlung Java Java Basics - Anfänger-Themen 12
S Hashcode-Berechnung + ^ Java Basics - Anfänger-Themen 2
J Median-Berechnung von 2D-Teilarrays Java Basics - Anfänger-Themen 56
F Tabelle - Berechnung Rang Java Basics - Anfänger-Themen 2
B Berechnung der Position von Kinderelemente von einem Elternknoten Java Basics - Anfänger-Themen 23
S Berechnung der sleep time ist falsch Java Basics - Anfänger-Themen 46
S Switch-Case zur Berechnung der Einkommensteuer Java Basics - Anfänger-Themen 15
F Berechnung der Rektaszension und Deklination eines Sterns Java Basics - Anfänger-Themen 7
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
V Erste Schritte Pi Berechnung Java Basics - Anfänger-Themen 47
M Berechnung der Reststrecke bei Graphen Java Basics - Anfänger-Themen 1
V Algorithmus zur fortlaufenden Berechnung des duechscjnt Java Basics - Anfänger-Themen 1
B Berechnung zu einer Schleife formen Java Basics - Anfänger-Themen 6
B Berechnung Median mit Methode Java Basics - Anfänger-Themen 7
CptK Methoden Berechnung von Anfangsgeschwindigkeit und Winkel Java Basics - Anfänger-Themen 27
K Erste Schritte Berechnung der Summe zweier Arrays Java Basics - Anfänger-Themen 15
J Gleitkommazahlen, Berechnung von pi Java Basics - Anfänger-Themen 4
J Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
kilopack15 Verzweiflung wegen Berechnung mit Multithreading Java Basics - Anfänger-Themen 1
A Die Werte zur Berechnung müssen als Parameter übergeben werden? Java Basics - Anfänger-Themen 7
Salo Berechnung von Winkeln Java Basics - Anfänger-Themen 28
M Restbuchwert Berechnung geht nicht Java Basics - Anfänger-Themen 45
Ghostman1711 Pi berechnung Methode aufrufen Java Basics - Anfänger-Themen 2
L Rekursive Methode zur Berechnung der Potenz q hoch p Java Basics - Anfänger-Themen 17
beatles Operatoren Operatoren - Berechnung Java Basics - Anfänger-Themen 40
K Best Practice Algorithmus für Berechnung von Zahlenreihenfolge Java Basics - Anfänger-Themen 12
N Verzögerte Berechnung "Lazy" Java Basics - Anfänger-Themen 8
J Erste Schritte Rundungsproblem - Berechnung Notendurchschnitt Java Basics - Anfänger-Themen 13
S Variablen Vektor zur Berechnung verwenden Java Basics - Anfänger-Themen 4
T Java double berechnung fehler Java Basics - Anfänger-Themen 2
M Berechnung in Java Java Basics - Anfänger-Themen 4
S Berechnung der Arbeitstage in einem Zeitraum Java Basics - Anfänger-Themen 9
E Problem bei rekursiver Berechnung des Binomialkoeffizienten Java Basics - Anfänger-Themen 5
T Iterative Pi Berechnung in Rekursive Java Basics - Anfänger-Themen 2
S Double, int, Berechnung Java Basics - Anfänger-Themen 3
C Nach Berechnung runden und Wert ausgeben Java Basics - Anfänger-Themen 7
E Berechnung für Shop einbinden Java Basics - Anfänger-Themen 8
S Klassen Formel zur Berechnung .... Bitte um Hilfe Java Basics - Anfänger-Themen 7
S Euklid Algorithmus zur Berechnung des GGTs Java Basics - Anfänger-Themen 2
OnDemand Berechnung in die start und paint Methode eines Applets Java Basics - Anfänger-Themen 28
P Schleife zur Berechnung von einer Summe Java Basics - Anfänger-Themen 16
F Berechnung einer linearen Abschreibung Java Basics - Anfänger-Themen 5
E Berechnung von Punkten Java Basics - Anfänger-Themen 4
D Berechnung des Abstandes von zwei Punkten in einem Koordinatensystem Java Basics - Anfänger-Themen 14
A Methoden PI-Berechnung Java Basics - Anfänger-Themen 22
S Erste Schritte Berechnung mit Daten aus CSV und Date Objekt Java Basics - Anfänger-Themen 2
C Programm zur Berechnung der Spur einer Matrix Java Basics - Anfänger-Themen 4
P Pythagoras Baum - Berechnung der Punkte Java Basics - Anfänger-Themen 9
A Erste Schritte Steuer Berechnung, Alters Abhängig Java Basics - Anfänger-Themen 5
T Erste Schritte Berechnung von gerade und ungerade Zahlen Java Basics - Anfänger-Themen 10
J Erste Schritte Berechnung Ratten vermehrung Java Basics - Anfänger-Themen 4
P falsches ergebnis bei einfacher berechnung Java Basics - Anfänger-Themen 3
T Iterative Berechnung einer Satellitenbahn Java Basics - Anfänger-Themen 20
M Java Berechnung mit mehreren Lösungen? Java Basics - Anfänger-Themen 9
D Nullstellen-Berechnung Java Basics - Anfänger-Themen 10
L Fehlermeldung bei falscher Berechnung anzeigen Java Basics - Anfänger-Themen 31
A berechnung multiplikatives inverses Java Basics - Anfänger-Themen 5
J Berechnung des aktuellen Alters auf Basis des Geburtstags Java Basics - Anfänger-Themen 45
J Datentypen Fehler bei Berechnung mit Double und Int-Werten Java Basics - Anfänger-Themen 22
G Berechnung von Winkeln mit Cosinussatz Java Basics - Anfänger-Themen 2
B Arrays verwenden für Berechnung Java Basics - Anfänger-Themen 3
R Merkwürdige Modulo Berechnung Java Basics - Anfänger-Themen 7
B Hausaufgabe Berechnung quadratischer Funktion Java Basics - Anfänger-Themen 16
U Alter Berechnung + sortierung Java Basics - Anfänger-Themen 6
P Berechnung wird nicht durchgeführt Java Basics - Anfänger-Themen 2
D Berechnung von Ostern und Ramadan! Java Basics - Anfänger-Themen 24
N Algorithmus für Berechnung einer Quersumme Java Basics - Anfänger-Themen 9
D Berechnung von Geldausgabe Java Basics - Anfänger-Themen 22
F Berechnung von Kugeln! Java Basics - Anfänger-Themen 9
M rekursive Funktion zur Berechnung der Spiegelzahl Java Basics - Anfänger-Themen 7
S Hausaufgabe: Java-Programm schreiben zur Berechnung von x und y Java Basics - Anfänger-Themen 9
Y Ergebnis einer Berechnung an die Main Methode übergeben Java Basics - Anfänger-Themen 11
Semox Ersten Wert eines Intervalls bei Berechnung einschließen Java Basics - Anfänger-Themen 8
J Logarithmische Berechnung und Arrays Java Basics - Anfänger-Themen 2
B LinkedList - Berechnung des Produkts Java Basics - Anfänger-Themen 6
B Berechnung von Preisen per Java-Programm Java Basics - Anfänger-Themen 27
M Alters berechnung aus Geburtsjahr aus dem Buch Java Basics - Anfänger-Themen 5
O Fehler in der String-Distanz-Berechnung Java Basics - Anfänger-Themen 5
-horn- "Berechnung vorwärts, Optimierung rückwärts?" - Wie würdet ihr das machen? Java Basics - Anfänger-Themen 8
P iterative Berechnung Java Basics - Anfänger-Themen 9
1 Berechnung von PI mithilfe von Buffons Nadelproblem Java Basics - Anfänger-Themen 2
G Berechnung zwei Komplexen Zahlen Java Basics - Anfänger-Themen 34
N Rekursive Berechnung der Höhe eines binären Baumes Java Basics - Anfänger-Themen 4
J Programm für interaktive Berechnung von Temperaturverläufen Java Basics - Anfänger-Themen 9
K Annährende ganzzahlige Berechnung der Wurzel Java Basics - Anfänger-Themen 8
L Berechnung von Perioden Java Basics - Anfänger-Themen 4
D einfach berechnung einer onlinezeit Java Basics - Anfänger-Themen 25
S Euklid Klasse mit Methoden zur Berechnung des ggT Java Basics - Anfänger-Themen 23
G Frage zur Primzahlen berechnung Java Basics - Anfänger-Themen 11
G Berechnung von N-Tageslinien von Aktienkursen Java Basics - Anfänger-Themen 13
G Rekursive Berechnung von n über k schlägt fehl Java Basics - Anfänger-Themen 5
G Einfache Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
W Schaltjahr Berechnung Java Basics - Anfänger-Themen 24
A Probleme mit Programm zur Pi-Berechnung Java Basics - Anfänger-Themen 6
X Temperatur-Berechnung /Array(?) Java Basics - Anfänger-Themen 5
L Berechnung Summe Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben