Euromünzen in enum als Liste ausgeben

kilopack15

Aktives Mitglied
Hallo Leute,
ich habe folgende Aufgabe gelöst und wollte mal euer Feedback zu meiner Lösung haben, da ich nun das erste Mal mit enum und LinkedList programmiert habe.
Die Aufgabe:
a.)Implementieren Sie zur Repräsentation von Euro-Münzen einen Aufzählungstyp (Enum) Muenze! Der Aufzählungstyp enthält für jede Euro-Münze genau ein Element:
EinCent, ZweiCent, FuenfCent, ZehnCent ZwanzigCent, FuenfzigCent, EinEuro, ZweiEuro
Implementieren Sie außerdem eine Methode int getValue(), die den Wert einer
Euro-Münze (in Cent) liefert!

b) Implementieren Sie folgende statische Methode: public static LinkedList<Muenze> getMuenzen(int wertInCent) Diese liefert eine Liste von Euro-Münzen,sodass der Wert aller Münzen zusammen dem übergebenen nicht negativen Betrag (in Cent) entspricht! Beachten Sie dabei, dass die Liste nur eine minimale Anzahl an Münzen enthalten darf! Für negative Werte soll eine IllegalArgumentException geworfen werden!

Meine Lösung:
Java:
import java.util.LinkedList ;
import java.lang.IllegalArgumentException;
//a.)
public enum Muenze {
    //Aufzählen der Elemente von Muenze
    EinCent, ZweiCent, FuenfCent, ZehnCent,
    ZwanzigCent, FuenfzigCent, EinEuro, ZweiEuro;
 
 
    /** Methode gibt den Wert in Cent einer Münze zurück
     * @param
     * @return Wert der Münze in Cent
     */
    int getValue(){
        switch(this){
        case EinCent: return 1;
        case ZweiCent: return 2;
        case FuenfCent: return 5;
        case ZehnCent: return 10;
        case ZwanzigCent: return 20;
        case FuenfzigCent: return 50;
        case EinEuro: return 100;
        case ZweiEuro: return 200;
        default: return 0;
        }
    }
  
    // b.)
    /**
     * Methode erstellt eine Liste von Münzen, die zusammen addiert Parameter wertInCent ergeben.
     * @param wertInCent
     * @return Es wird eine Liste zurückgegeben, die die Münzen enthält, die addiert den wertInCent
     * ergeben.
     */

    public static LinkedList<Muenze> getMuenzen(int wertInCent){
        //Exception, falls wertInCent negativ
        if(wertInCent < 0){
            throw new IllegalArgumentException();
        }
        //Erstellen einer neuen LinkedList
        LinkedList<Muenze> list = new LinkedList<Muenze>();
     
        /*während der wertInCent größer als 200 Cent ist, wird eine Zwei-Euro-Münze zur
        Liste hinzugefügt. Analog bei den weiteren Münzen
        */
     
        while(wertInCent>=200){
            list.add(ZweiEuro);
            wertInCent -= 200;
        }
     
        while(wertInCent>=100){
            list.add(EinEuro);
            wertInCent -= 100;
        }
     
        while(wertInCent>=50){
            list.add(FuenfzigCent);
            wertInCent -= 50;
        }
     
        while(wertInCent>=20){
            list.add(ZwanzigCent);
            wertInCent -=20;
        }
     
        while(wertInCent>=10){
            list.add(ZehnCent);
            wertInCent -=10;
        }
     
        while(wertInCent>=5){
            list.add(FuenfCent);
            wertInCent -= 5;
        }
     
        while(wertInCent>=2){
            list.add(ZweiCent);
            wertInCent -=2;
        }
     
        while(wertInCent>=1){
            list.add(EinCent);
            wertInCent -=1;
        }
        //Ausgeben der Liste
        if(wertInCent == 0){
            return list;
        }
        return list;
    }
}
Habe ich die Aufgabe richtig gelöst?
 

AndyJ

Bekanntes Mitglied
Der switch in dem Enum ist keine gute Idee. Ein enum Typ ist ja eine vollstaendige Klasse, also kannst du die gestalten wie du willst. Der individuelle Wert ist ja der Cent-Betrag, also kannst du den deinen Objekten mitgeben:

Code:
public enum Muenze {
  EinCent(1),
  ZweiCent(2),
  FuenfCent(5),
  ZehnCent(10),
  ZwanzigCent(20),
  FuenfzigCent(50),
  EinEuro(100),
  ZweiEuro(200);

  private final int value;

  private Muenze(int value) {
  this.value = value;
  }

  public int getValue() {
  return this.value;
  }

}

Weiter unten im Code hast du noch folgende Statements:
Code:
   //Ausgeben der Liste
   if(wertInCent == 0){
     return list;
   }
   return list;

Da wertInCent an dieser Stelle nur 0 sein kann, genuegt das return list; Statement.

Andy
 

stg

Top Contributor
Richtig gelöst ist sie erst einmal.

Zusätzlich zu den bereits gemachten Anmerkungen, sollten dir aber auch deine zahlreichen komplett gleich aufgebauten while-Schleifen ins Auge springen. Das schreit nach Verbesserung.
Ich würde hier der Größe nach absteigend über alle Münzen iterieren, und dann für jede einzelne Münze .... du kommst bestimmt selbst drauf.
Somit eliminierst du all deine Wiederholungen im Code und kommst mit etwa 30 Zeilen weniger Code aus.
 

Jardcore

Top Contributor
Enums haben noch mehr möglichkeiten dein Problem zu lösen. Zu jedem Wert können noch beliebige Parameter hinzugefügt werden. Dafür benötigst du einen Konstruktor und private Attribute.

Im folgenden Beispiel wurde der Wert einer Münze als Parameter hinzugefügt.
Java:
public enum Muenze {
    ZweiEuro(200),
    EinEuro(100),
    FuenfzigCent(50),
    ZwanzigCent(20),
    ZehnCent(10),
    FuenfCent(5),
    ZweiCent(2),
    EinCent(1);
   
    private int valueInCent;
    private Muenze(int valueInCent) {
        this.valueInCent = valueInCent;
    }
   
    public int getValue() {
        return valueInCent;
    }
 
    public static LinkedList<Muenze> getMuenzen(int wertInCent){

        if(wertInCent < 0){
            throw new IllegalArgumentException();
        }
       
        LinkedList<Muenze> minimalListOfCoins = new LinkedList<Muenze>();
    
        // solange weiter machen, bis der wertInCent 0 ist
        while (wertInCent != 0) {
            // alle Enumwerte durchgehen, angefangen bei ZweiEuro.
            for(Muenze muenze : Muenze.values()) {
                /* Wenn der übergebene Cent-Wert größer oder gleich dem aktuellen Muenzwert ist
                 * wird der aktuelle Meunzwert zur Liste hinzugefügt und der Wert vom übergebenen wertInCent abgezogen.
                 * Damit wieder möglichst wenig Münzen gebildet werden, wird die Schleife dann unterbrochen und es wird
                 * wieder bei ZweiEuro gestartet.
                 */
                if(wertInCent >= muenze.getValue()) {
                    minimalListOfCoins.add(muenze);
                    wertInCent -= muenze.getValue();
                    break;
                }
            }
        }

        return minimalListOfCoins;
    }
}
 

X5-599

Top Contributor
Hab ein wenig Langeweile. Ich hätte es wohl so gemacht:

Code:
public static List<Muenze> getMuenzen(int amountCents)
{
	List<Muenze> muenzen = new ArrayList<Muenze>();
	
	for(Muenze muenze : Muenze.values())
	{
		int nCoins = amountCents / muenze.getValue();
		for(int i = 0; i < nCoins; i++)
		{
			muenzen.add(muenze);
		}
		
		amountCents = amountCents % muenze.getValue();
	}
	
	return muenzen;
}
 

Jardcore

Top Contributor
Sehr gut, hatte mir schon gedacht, das es etwas besser geht.
Es muss aber hier erwähnt werden, das die Reihenfolge des Enums bei meinem und dem letzten Vorschlag extrem wichtig ist.
 

X5-599

Top Contributor
Da hast du natürlich recht. Ist eigentlich irgendwo definiert wie das Enum#values() sein Array erstellt? Um sicher zu gehen kann man aber auch sein eigenes Array erstellen. So z.B.:

Code:
public static List<Muenze> getMuenzen(int amountCents)
{
	List<Muenze> muenzen = new ArrayList<Muenze>();
	
	Muenze[] all = new Muenze[] {
			Muenze.ZWEI_EURO,
			Muenze.EIN_EURO,
			Muenze.FUENFZIG_CENT,
			Muenze.ZWANZIG_CENT,
			Muenze.ZEHN_CENT,
			Muenze.FUENF_CENT,
			Muenze.ZWEI_CENT,
			Muenze.EIN_CENT
	};
	
	for(int i = 0; i < all.length; i++)
	{
		Muenze muenze = all[i];
		
		int nCoins = amountCents / muenze.getValue();
		for(int j = 0; j < nCoins; j++)
		{
			muenzen.add(muenze);
		}
		
		amountCents = amountCents % muenze.getValue();
	}
	
	return muenzen;
}
 

X5-599

Top Contributor
Danke für den Tipp. Normalerweise reicht mir ein Blick in die API Doku. Leider verlinkt Eclipse bei der Enum#values() Methode nichts...

>> "Returns an array containing the constants of this enum type, in the order they're declared."

Da also tatsächlich die Rückgabe Reihenfolge von Enum#values() garantiert ist, würde ich meine Variante aus Post #5 vorziehen. Weil: weniger Zeilen Code und übersichtlicher. Aber natürlich wie @Jardcore schon sagte: Die Reihenfolge in der man die Elemente des Muenze Enums anlegt ist sehr wichtig.
 

AndyJ

Bekanntes Mitglied
Ein Algorithmus sollte sich nicht auf die Order der enum values verlassen. Die kann sich naemlich jederzeit aendern, wenn jemand die enums neu anordnet und dann funktioniert der Algorithmus nicht mehr. Solche Fehler sind dann schwer zu finden. Besser waere es vielleicht, eine statische Methode hinzuzufuegen die die enums sortiert nach Wert zurueckliefert.
 

Jardcore

Top Contributor
Folgenden Code könnte man dazu benutzen die Muenzen immer absteigend zu bekommen.
Java:
    public static List<Muenze> getCoinsDescending() {
        return Arrays.asList(Muenze.values()).stream()
                .sorted((c1, c2) -> Integer.compare(c2.getValue(), c1.getValue()))
                .collect(Collectors.toList());
    }
 

Flown

Administrator
Mitarbeiter
@Jardcore besser wäre dann noch:
Java:
public static List<Muenze> getSortedList() {
  return Collections.unmodifiableList(Arrays.stream(values())
      .sorted(Comparator.comparingInt(Muenze::getValue).reversed()).collect(Collectors.toList()));
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
volcanos enum und switch (neu): falschen Wert mit IllegalArgumentException oder mit EnumConstantNotPresentException abfangen ? Java Basics - Anfänger-Themen 51
X Enum Abfrage ohne if, for, while oder switch Java Basics - Anfänger-Themen 21
U Warum kann ich die Methode in der ENUM Klasse nicht aufrufen? Und warum geht die Switch nicht? Java Basics - Anfänger-Themen 8
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
S Java Enum Java Basics - Anfänger-Themen 2
I Validation, ob String ein Wert aus einem Enum enthält Java Basics - Anfänger-Themen 3
V Enum Java Basics - Anfänger-Themen 1
C Farben als Enum Java Basics - Anfänger-Themen 3
N enum Attribut von Objekten einer Hashmap ausgeben Java Basics - Anfänger-Themen 6
I JAXB und Enum Java Basics - Anfänger-Themen 7
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
B Enum innerhalb einer Klasse / anderes Konzept Java Basics - Anfänger-Themen 8
N Enum Typen, was passiert intern mit ihnen? Java Basics - Anfänger-Themen 2
A enum Java Basics - Anfänger-Themen 6
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
B ENUM to List<String> konvertieren Java Basics - Anfänger-Themen 2
N Java Enum converter Methode Java Basics - Anfänger-Themen 5
F Enum von Ländern Java Basics - Anfänger-Themen 8
J Klassen Enum als Informationsträger Java Basics - Anfänger-Themen 10
T Datentypen enum static Chaos (blutiger anfänger) Java Basics - Anfänger-Themen 5
R Enum ist das gleiche wie? Java Basics - Anfänger-Themen 15
P Klassen Richtige Anwendung einer Enum-Klasse Java Basics - Anfänger-Themen 11
E Datentypen Problem beim Speichern von enum. Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
E Objektvergleich Enum Java Basics - Anfänger-Themen 7
N Enum als generischer Typ Java Basics - Anfänger-Themen 4
H Datentypen Fehler bei Verwendung von enum Java Basics - Anfänger-Themen 9
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
S Menüauswahl per Enum Java Basics - Anfänger-Themen 12
F Enum via String definieren Java Basics - Anfänger-Themen 2
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
M java.lang.Enum.valueOf(Unknown Source) Java Basics - Anfänger-Themen 2
M Enum-Variabel-Abfrage funktioniert nicht? Java Basics - Anfänger-Themen 2
P Fallunterscheidung mit Überprüfung (enum) Java Basics - Anfänger-Themen 11
H enum Type Java Basics - Anfänger-Themen 6
F Operatoren Enum aus Textdabei laden Java Basics - Anfänger-Themen 3
P enum: cannot be resolved to a type Java Basics - Anfänger-Themen 2
kaoZ Variablen Konstantensammlung vs. Enum Java Basics - Anfänger-Themen 9
H Enum außerhalb einer Klasse? Java Basics - Anfänger-Themen 2
K OOP Aufzählungstypen! enum Currency!!! Java Basics - Anfänger-Themen 5
F ENUM als Variable Java Basics - Anfänger-Themen 4
M Enum: Zugriff auf Konstanten Java Basics - Anfänger-Themen 7
W Enum Konstruktor Type Java Basics - Anfänger-Themen 2
A Erste Schritte ENUM - Werte zurückgeben Java Basics - Anfänger-Themen 5
D Enum als Parameter Java Basics - Anfänger-Themen 6
B Variablen Instanz von Enum zur Laufzeit erstellen und zuweisen Java Basics - Anfänger-Themen 2
B Datentypen Enum vererben/gruppieren? Java Basics - Anfänger-Themen 6
F Datentypen enum Java Basics - Anfänger-Themen 5
J Enum zählen Java Basics - Anfänger-Themen 8
D Einlesen eines Enum-Wertes per console Java Basics - Anfänger-Themen 3
K String mit ENUM vergleichen? Java Basics - Anfänger-Themen 6
N enum vergleiche Klammern? Java Basics - Anfänger-Themen 5
J public enum? in Java Java Basics - Anfänger-Themen 9
D Erste Schritte Enum - das unbekannte Wesen Java Basics - Anfänger-Themen 3
Y ENUM auslesen (Name des ENUM als Variable) Java Basics - Anfänger-Themen 4
P Compiler-Fehler "class, interface, or enum expected" Java Basics - Anfänger-Themen 5
K class, interface or enum expected Java Basics - Anfänger-Themen 14
pg1337 enum-Aufgabe Java Basics - Anfänger-Themen 5
N was sagt enum aus? Java Basics - Anfänger-Themen 3
S Methoden Enum Parameter in Methode Java Basics - Anfänger-Themen 7
G Datentypen enum Frage Java Basics - Anfänger-Themen 3
R Probleme mit Enum Java Basics - Anfänger-Themen 10
B Enum: Instanzen Java Basics - Anfänger-Themen 10
B Generic? Enum - So lösbar? Java Basics - Anfänger-Themen 8
T class, interface, or enum expected Java Basics - Anfänger-Themen 2
M Vererbung Enum Vererbung/Polymorphie Java Basics - Anfänger-Themen 2
P Enum Attribut in Konstruktoren Java Basics - Anfänger-Themen 10
4 Enum Problem Java Basics - Anfänger-Themen 2
turmaline Bindestrich in enum? Java Basics - Anfänger-Themen 5
T Enum - Key als Value ermitteln Java Basics - Anfänger-Themen 7
X enum Fehlermeldung "The public type Day must be defined in its own file" Java Basics - Anfänger-Themen 8
T ist enum.ordinal keine Konstante? Java Basics - Anfänger-Themen 7
R State machine mit enum Java Basics - Anfänger-Themen 9
L enum aus Integer umwandeln Java Basics - Anfänger-Themen 3
C Klasseninstanzierung mit enum-Parameter erzwingen Java Basics - Anfänger-Themen 2
I Enum in String Java Basics - Anfänger-Themen 4
N enum richtig verwenden Java Basics - Anfänger-Themen 5
M for(Enum..., ButtonGroup.getElements()... Java Basics - Anfänger-Themen 3
StrikeTom Fragen zu enum Java Basics - Anfänger-Themen 4
A Was ist performanter für Konstanten, enum oder static variablen Java Basics - Anfänger-Themen 5
L String zu Enum parsen Java Basics - Anfänger-Themen 8
J Datentypen Array in enum, ?? Wozu ?? Java Basics - Anfänger-Themen 3
S OOP Durch ein Enum iterieren... Java Basics - Anfänger-Themen 47
K Datentypen enum und liste Java Basics - Anfänger-Themen 7
S String - Enum Java Basics - Anfänger-Themen 3
H Eine enum switchen? Java Basics - Anfänger-Themen 7
G enum für Typsicherheit Java Basics - Anfänger-Themen 9
J class, interface, or enum expected - finde Fehler nicht. Java Basics - Anfänger-Themen 4
J OOP enum Java Basics - Anfänger-Themen 2
O Problem (Enum) Java Basics - Anfänger-Themen 14
S Enum als Index Java Basics - Anfänger-Themen 5
H Enum --> int ?? Java Basics - Anfänger-Themen 3
tanja enum in java Java Basics - Anfänger-Themen 3
D class, interface or enum expected Java Basics - Anfänger-Themen 2
A OOP Übergabe eines Wertes an den enum Konstruktor Java Basics - Anfänger-Themen 12
T Simple Enum Fragen Java Basics - Anfänger-Themen 6
J class, interface, or enum expected Java Basics - Anfänger-Themen 4
R Enum und dann setter Setzen? Java Basics - Anfänger-Themen 44

Ähnliche Java Themen

Neue Themen


Oben