verkettete Liste auslesen

Status
Nicht offen für weitere Antworten.

MarkusU

Mitglied
Hallo!

Ich habe folgendes Problem bei einer Programmieraufgabe:

In einer verketten Liste sind Objekte meiner Klasse Geschenk gespeichert. Diese Klasse enthält u.a. den Namen des Kindes, für die das Geschenk (als String) ist, sowie den Wert des Geschenks (als float) und einen Verweis auf den Nachfolger in der Liste.

Nun soll ich eine rekursive Methode in einer Klasse Beutel schreiben, die ausgibt, wie viele Geschenke jedes einzelne Kind bekommt. (Klasse Beutel (damit ist der Beutel des Nikolaus gemeint => es weihnachtet 🙂 enthält die Referenzvariable auf das erste Glied einer Liste von Geschenken)


Und da liegt das Problem: Ich muss ja zuerst irgendwie berechnen, wie viele Geschenke jedes Kind bekommt, d.h. die Liste durchlaufen und dann die Information "extern" speichern, da ich am Anfang der Liste ja noch nicht weiß, wie oft ein bestimmtes Kind später in der Liste noch auftaucht und ein Geschenk bekommt.

Ich habs mit nem Array versucht (bzw. mit 2 Arrays, einen vom Typ String für die Namen der Kinder und einem vom Typ float für den Wert des Geschenks => sehr schlechter Programierstil), aber das funktioniert nicht (Wo und wie (static?) müsste ich diesen Array anlegen -> innerhalb der Methode geht nicht, da die Methode rekursiv ist, in der Klasse mit static funktionierts auch nicht)

Oder gibts einen ganz anderen (saubereren) Lösungsansatz ohne Array / Zwischenspeichern??

Ich hoffe jemand hat das Problem verstanden 🙂

Danke schonmal für die Antworten !!


Gruß,

Markus

Code:
public class Geschenk
{
	String kind;
	float wert;
	Geschenk nf;
}


Code:
class Beutel
{
	Geschenk untenimbeutel;	// verweist auf das erste Objekt der Liste
   
       void gibKinderunddieAnzahlderenGeschenkeaus()
       {
       // ???
       }
}
 
In einer verketten Liste sind Objekte meiner Klasse Geschenk gespeichert. Diese Klasse enthält u.a. den Namen des Kindes, für die das Geschenk (als String) ist, sowie den Wert des Geschenks (als float) und einen Verweis auf den Nachfolger in der Liste.
Zeig doch mal den Code, dann kann man konkretere Antworten geben.
 
Hier der gesamte Code. Wie gesagt, das mit den Arrays ist wohl völlig falsch ...
Wahrscheinlich wäre ein anderer Ansatz besser?


Code:
class Beutel
{
	Geschenk untenimbeutel;	// entspricht head 
	
       // Die beschriebenenArrays (funktionieren natürlich nicht):
	public static String[] kindername = new String[this.anzahlgeschenke];
	public static int[] geschenkzahl = new int[kindername.length];
	public static float[] geschenkwert = new float[kindername.length];  
	
	Beutel(Geschenk k)
	{
		this.obenimbeutel = this.untenimbeutel = k;
	}
	


	// neues Geschenk in den Beutel werfen
	void neuesGeschenk(Geschenk neu)
	{
		if (this.untenimbeutel == null) // falls Beutel leer
		{
			this.untenimbeutel = this.obenimbeutel = neu;	// -> erstes Geschenk im Beutel
		}
		else neuesGeschenk(neu, untenimbeutel.nf); 
	}
	
	void neuesGeschenk(Geschenk neu, Geschenk g)
	{
		if (g.nf == null)	//  falls g oberstes Geschenk im Beutel
		{
			g.nf = untenimbeutel = neu;  
		}
		else neuesGeschenk(neu, g.nf);	
	}
	
	
	
	
	
	// Geschenke pro Kind -- hier die "Problemmethode" - sieht irgendwie verheerend aus ...
	
	int anzahlGeschenke()
	{
		if (this.untenimbeutel == null)	return 0;
		else return (anzahlGeschenke(this.untenimbeutel) + 1);
	}
	int anzahlGeschenke(Geschenk g)
	{
		if (g.nf == null) return 0;
		else return (anzahlgeschenke(g.nf) + 1);
	}
	
	
	void GeschenkeproKindausgeben()
	{
		
		if (this.untenimbeutel == null)	return;
		else GeschenkeproKindausgeben(this.untenimbeutel);
	}

	void GeschenkeproKindausgeben(Geschenk g)
	{
		for (int i = 0; i < kindername.length; i++)
		{
			if (g.kind == kindername[i])		// um den String-Vgl. kümmere ich mich ein anderes mal...
			{
				geschenkwert[i] = geschenkwert[i] + g.wert;
				geschenkzahl[i] = geschenkzahl[i] + 1;
			}
						
			else if (kindername[i] == "")			// um den auch		
			{
				kindername[i] = g.name;
				geschenkwert[i] = g.wert;
				geschenkzahl[i] = 1;
				
				for (int j = 0; j < kindernahme.length; j++)
				{	
					if (kindername[i] == "") break;                // und um den
					System.out.println(kindername[i] + " bekommt " + geschenkanzahl + " Geschenk(e)");
					break;
				}
				break;
			}
		}
		
		if (g.nf == null) return;
		else GeschenkeproKindausgeben(g.nf);
	}

	
	
	// Gesamtwert der Geschenke
	float gesamtwert()
	{
		if (this.untenimbeutel == null)	return 0f;	//  Beutel leer
		else return (gesamtwert(this.untenimbeutel) + this.untenimbeutel.wert);
	}
	float gesamtwert(Geschenk g)
	{
		if (g.nf == null) return g.wert;
		else return (gesamtwert(g.nf) + g.wert);
	}
	
	
	void ausgabe()
	{
		if (this.untenimbeutel == null) return;
		else
		{
			System.out.println(this.untenimbeutel.name);
			if (this.untenimbeutel.nf != null)	ausgabe(this.untenimbeutel.nf);		
		}
	}	
	
	void ausgabe(Geschenk gg)
	{
		System.out.println(gg.name);
		if (gg.nf != null) ausgabe(gg.nf);
	}
	
	public static void main (String[] args)
	{
	
		Geschenk g4 = new Geschenk("Holzhammer", "Bart", 5f, null);
		Geschenk g3 = new Geschenk("Eisenhammer", "Lisa", 5f, g4);
		Geschenk g2 = new Geschenk("Gummiknüppel", "Maggy", 5f, g3);
		Geschenk g1 = new Geschenk("Rammbock", "Homer", 5f, g2);		
		
		Beutel b1 = new Beutel(g1);
		
		b1.ausgabe(b1.untenimbeutel);
		
		System.out.print("Anzahl der Geschenke im Beutel: " + b1.anzahlGeschenke());
		
	}
	
}

Und die Klasse Geschenk:
Code:
public class Geschenk
{
	String name;
	String kind;
	float wert;
	Geschenk nf;
	
	public Geschenk(String cname, String ckind, float cwert, Geschenk cnf)
	{
		this.name = cname;
		this.kind = ckind;
		this.wert = cwert;
		this.nf = cnf; //Standardwert
	}
}
 
OK, hier die Aufgabe:

"Schreiben Sie zwei JAVA-Klassen namens Beutel und Geschenk. Ein Beutel ist eine
Liste von Geschenken. Jedes Geschenk hat drei Eigenschaften (3 Parameter): der Name
des Geschenks, der Name des Kindes, das dieses Geschenk bekommt, und den Wert
des Geschenks.

Dazu sind vier Methoden der Klasse Beutel zu schreiben:

Die erste soll die Liste von Geschenken mit einem neuen Geschenkwunsch erg anzen;
-> müsste funktionieren

die zweite soll bestimmen und ausgeben, wieviele Geschenke jedes Kind bekommt;

die dritte soll den Namen des Kindes bestimmen und ausgeben, welches die teuersten Geschenke (die größte
Summe der Werte) bekommt;

die vierte soll den Gesamtwert der Geschenke berechnen."
-> müsste auch funktionieren



Die Methoden 1 und 4 sind rekursiv relativ einfach lösbar, aber die 2. u. 3. eben nicht: Die krieg ich leider nicht hin...
 
Für zweitens würde ich in Beutel folgende Methoden deklarieren:

Code:
public void druckeGeschenkAnzahlProKind() {
  final Map<String,Integer> sammlung = new TreeMap<String,Integer>();
  sammleGeschenkAnzahlProKind(sammlung, untenimbeutel);
  for (Map.Entry<String,Integer> entry : sammlung.entrySet()) {
    System.out.println("Kind " + entry.getKey() + " bekommt " + entry.getValue() + " Geschenke");
  }
}

private void sammleGeschenkAnzahlProKind(Map<String,Integer> sammlung, Geschenk geschenk) {
  final Integer anzahl = sammlung.get(geschenk.name);
  if (anzahl == null) {
    sammlung.put(geschenk.name, new Integer(1));
  } else {
    sammlung.put(geschenk.name, new Integer(anzal.intValue() + 1));
  }
  if (sammlung.nf != null) {
    sammleGeschenkAnzahlProKind(sammlung.nf);
  }
}

Ich hab's im Browser getippt. Kann gut sein, dass ich ein paar kleine Tippfehler drin hab.

Hilft Dir das so?

Ebenius
 
Das sieht doch auf den ersten Blick viel besser aus.

Werds heut Mittag probieren, aber müsste funktionieren.


Danke!!
 
Nur der Vollständigkeit halber:

Der Code von Ebenius beinhaltet einige mir (noch 🙂 unbekannte Elemente, aber hat mich auf eine neue Idee gebracht:

Ich hab eine neue Klasse vom Typ Speicher mit den Attributen Name (des Kindes), Wert (der Geschenke des Kindes) und Anzahl (auch der Geschenke des Kindes) angelegt.
Die Geschenke hab ich dann in ein Array vom Typ Speicher abgelegt und entsprechende Methoden hinzugefügt.

Funktioniert jetzt (endlich) alles!!

Danke für alle Antworten!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben