einfach verkettete Liste, intersect

Status
Nicht offen für weitere Antworten.
R

Reap

Gast
Hallo...ich hab da ein Problem wo ich einfach nicht weiß warum das auftritt.....und das komische ist, wenn ich die gleiche Methode nur ein bißl anders verwende gehts auf einmal...ich bin total fertig...aber seht selbst:

Gegeben Sei eine Liste welche Studenten verwaltet, also Studenten als Knoten besitzt:

Code:
public class Student {

	private String forename;
	private String surname;
	private int matrNr;
	private int[] exercises;
	public Student next;
	....usw.
}

Das Problem tritt jetzt bei der Liste auf und zwar bei der Methode static public StudentSet intersect(StudentSet s1, StudentSet s2){...}

Liste:

Code:
public class StudentSet {
   
	private Student head;
	private Student tail;
	private int nElems;
	
	public StudentSet(){
		head = tail = null;
		nElems = 0;
	}
	
	public void printList(){
		Student cur = head;

		while (cur != null){
			System.out.println(cur.toString());
			System.out.println();
			System.out.println(cur.getName());
		    cur = cur.next;
		}
	}
	
	/**
          * Neuen Studenten hinzufügen (dessen MNr noch nicht in der Menge ist sonst
	 * ignorieren)
          */
	public void addStudent(Student obj){
	     		
		/*if(obj.getMatrNr() == 8456322){
			System.out.println("Hallo");
		}
		*/
		if(!contains(obj.getMatrNr())){
	    	 
			 if(isEmpty()){
				 
				 head = obj;
				 tail = head;
			 }else{
				 Student cur;
				 Student prev;
				 cur = head;
				 prev = null;
				 
				 boolean fixPosition = false;
				 
				 while(cur != null && !fixPosition){
					 if(cur.getSurname().compareTo(obj.getSurname())<0){
						 prev = cur;
						 cur = cur.next;
					 }else{
						 fixPosition = true;
					 } 
				 }
				 
				 if(cur == head){
					 obj.next = head;
					 head = obj;
				 }else{
				     if(cur == null){
				    	 tail.next = obj;
				    	 obj = tail;
				     }else{
				    	 obj.next = cur;
				    	 prev.next = obj;
				     }
				 }  
			 } 
			 nElems++;
	     }
	}

	/**
	 * Neuen Studenten hinzufügen (dessen MNr noch nicht in der Menge ist sonst
	 * ignorieren)
     */ 
	public Student addStudent(String name, int matrNr){
		Student obj = new Student(name,matrNr);
		addStudent(obj);
		return obj;
	}
	
	/** Test, ob Student mit Matrikelnummer matrNr enthalten ist */ 
	public boolean contains(int matrNr){
		Student cur;
		if(!isEmpty()){
			cur = head;
			while(cur != null){
				if(cur.getMatrNr() == matrNr){
					return true;
				}
				cur = cur.next;
			}
		}
		return false;
	}
	
	public Student getHead(){
		return head;
	}
	
	/** Schnittmenge von zwei Studentenmengen */ 
	static public StudentSet intersect(StudentSet s1, StudentSet s2){
		StudentSet s4 = new StudentSet();
		Student cur = s1.getHead();
		while(cur != null){
			if(s2.contains(cur.getMatrNr())){
				//intsctn.addStudent(cur.getName(),cur.getMatrNr());
				s4.addStudent(cur);
			}
			
			cur = cur.next;
		}
		return s4;	
	}
	
	
	//private methods --------------------------------------
	
	private boolean isEmpty(){
		if(head == null){
			return true;
		}
		return false;
	}
	
}

Wenn ich das Ganze jetzt teste geht die Methode intersect nicht korrekt. Also wenn ich folgendes Testszenario gegeben habe:

Code:
                   StudentSet s1 = new StudentSet();
		 Student a = new Student("Hullu Kanne",9456521);
		 Student b = new Student("Gusenhuber Michael",8456322);
		 Student c = new Student("Zen Susi",8256322);
		 Student h = new Student("Hammer Michael",7327242);
		 
		 s1.addStudent(a);
		 s1.addStudent(b);
		 s1.addStudent(c);
		 s1.addStudent(h);
		 
		 StudentSet s2 = new StudentSet();
		 Student d = new Student("Bullu Panne",7432314);
		 Student e = new Student("Gusenhuber Michael",8456322);
		 Student f = new Student("Zen Susi",8256322);
		 Student g = new Student("Bachmaier Christian",6439737);
		 
		 s2.addStudent(d);
		 s2.addStudent(e);
		 s2.addStudent(f);
		 s2.addStudent(g);
		 
		  StudentSet s3 = StudentSet.intersect(s1, s2);
		  s3.printList();

Dann gibt es mir für s3 folgendes aus:(in verkürzter Form)
Gusenhuber Michael; Hammer Michael;Hullu Kanne; Zen Susi
anstatt:
Gusenhuber Michael;Zen Susi

Wenn ich jetzt aber jetzt in der Methode intersect anstatt
Code:
s4.addStudent(cur);
Code:
s4.addStudent(cur.getName(),cur.getMatrNr())
hischreibe was ja im Grunde genau dasselbe ist dann is plötzlich alles richtig...warum ist das so...was sehe ich da falsch...es muss irgendwas mit cur zu tun haben....

mfg,
Reap
 
S

SlaterB

Gast
zunächst mal, muss es nicht
Code:
}else{
                 if(cur == null){
                    tail.next = obj;
                    tail = obj;

statt

Code:
}else{
                 if(cur == null){
                    tail.next = obj;
                    obj = tail;
heißen? das scheint mir mehr Sinn zu machen und mit deiner Version schaffe ich es nicht einmal Liste 2 aufzubauen,

----------

ansonsten liegt der Fehler darin, dass du versuchst Elemente einer anderen Kette in die neue Kette einzubauen,
da fügst du das erste Element Gusenhuber ein und was hängt da hinten dran? der Rest von Kette 1,
also ist die gesamte Kette 1 mit einem Schlag in Kette 4 drin,

Abhilfe: korrekt so wie es zufällig schon machst: einfach ein neues Objekt erzeugen,
ansonsten hilft auch am Anfang von add der Befehl obj.next = null;
da kann einem dann die vorherige Zugehörigkeit nicht mehr stören,
dummerweise wird dabei die alte Kette 1 zerstört, insofern ist
addStudent(cur.getName(),cur.getMatrNr()) wohl die beste Lösung,


lerne daraus: eine verkettete Liste wie das Beispiel LinkedList gibt nie ihre Kettenglieder nach außen,
nimmt nie Kettenglieder von außen auf, sondern macht das alles intern,
da gibts Container die mit anderen Containern verlinkt ist,
Student-Objekte sind nur deren Dateninhalt und nicht selber verkettet,

wenn man das so trennt, dann kann es konzeptionell gar nicht zu einem solchen Fehler kommen!
(man kann natürlich noch viele andere Fehler einbauen ;) )
 
R

Reap

Gast
Ok...danke...(dass ich da nicht selbst draufgekommen bin :))..und danke für den kleinen aber blöden Fehler in der addMethode.... :wink:

Ich weiß aber nicht recht was du mit deinem Tipp am Schluss meinst:

lerne daraus: eine verkettete Liste wie das Beispiel LinkedList gibt nie ihre Kettenglieder nach außen,
nimmt nie Kettenglieder von außen auf, sondern macht das alles intern,
da gibts Container die mit anderen Containern verlinkt ist,
Student-Objekte sind nur deren Dateninhalt und nicht selber verkettet,


Meinst du dass ich eine eigenständige Node Klasse erstellen soll also z.b.:

Code:
class Node{

Student a;
Node next;

public Node(Student a){
  this.a = a;
  next = null;
}


}

was du ja hier erwähnst(Student-Objekte sind nur deren Dateninhalt und nicht selber verkettet,)...aber aud deinen anderen Sätzen werd ich noch nicht so recht schlau....denn ich will das Bsp. natürlich nicht ungeschickt gemacht abgeben.....

mfg,
Reap
 
R

Reap

Gast
Weiß keiner was

lerne daraus: eine verkettete Liste wie das Beispiel LinkedList gibt nie ihre Kettenglieder nach außen,
nimmt nie Kettenglieder von außen auf, sondern macht das alles intern,
da gibts Container die mit anderen Containern verlinkt ist,
Student-Objekte sind nur deren Dateninhalt und nicht selber verkettet,


konkret heißt...bzw. was ich da tun soll um mein Programm zu verbessern oder hab ich irgendwas unklar gefragt?

mfg,
Reap
 
S

SlaterB

Gast
ich war ne Weile nicht da, aber ich finde meine Sätze ziemlich deutlich ;)

schau dir die Klasse LinkedList an (wenn du die nicht kennst ist das natürlich schwerer zu verstehen),
da kann man beliebige Objekte reintun und wieder herausnehmen,

das ist toll, schrecklich wäre es wenn man für jede eigene Klasse die Listenfunktionen (wie kompliziert die sind merkst du ja selber) neu schreiben müsste..

das ist schrecklich aber auch gar nciht nötig,
wie du mit der Klasse Node richtig andeutest kann man sich Behälterklassen schaffen,
natürlich nicht mit einem Konstruktor der nach Student verlangt,
dann müsste man die -NodeKlasse ja auch für jede eigene Klasse anpassen und hätte wenig gewonnen,

Code:
class Node{

Object a;
Object next;

public Node(Object a){
  this.a = a;
  next = null;
}


}

ist besser und für beliebige Objekte verwendbar,

-------

aber mach dir nicht allzu große Gedanken, vielleicht ist die Aufgabe genau so gemeint speziell für die Studenten die Liste zu bauen,
ist nicht abwegig,
im Zweifel nachfragen
(Liste nur für Studenten oder allgemeine Liste für beliebige Objekte)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R einfach verkettete Liste Java Basics - Anfänger-Themen 1
R einfach verkettete Liste Java Basics - Anfänger-Themen 12
C Methoden Über eine einfach verkettete Liste Java Basics - Anfänger-Themen 8
O Einfach verkettete Liste - Revert Methode Java Basics - Anfänger-Themen 1
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
R Erste Schritte Verkettete Liste will einfach nicht in meinen Schädel Java Basics - Anfänger-Themen 11
K Einfach Verkettete Liste - addFirst() Java Basics - Anfänger-Themen 7
X Einfach verkettete Liste, keine Fehlermeldung Programm friert ein Java Basics - Anfänger-Themen 4
X Einfach Verkettete Liste Java Basics - Anfänger-Themen 16
K Datentypen Einfach/Doppelt verkettete Liste Java Basics - Anfänger-Themen 4
N einfach verkettete liste fehler Java Basics - Anfänger-Themen 5
N einfach verkettete liste Java Basics - Anfänger-Themen 3
B OOP Einfach verkettete Liste - rekursive Methoden Java Basics - Anfänger-Themen 1
S einfach verkettete Liste Java Basics - Anfänger-Themen 19
T Einfach verkettete Liste: Wie Elemente löschen? Java Basics - Anfänger-Themen 4
D Einfach verkettete Liste Java Basics - Anfänger-Themen 20
C einfach verkettete Liste -> Elemente vertauschen Java Basics - Anfänger-Themen 2
E einfach verkettete liste, nullPointerException Java Basics - Anfänger-Themen 5
S Einfach-Verkettete-Listen Ausgabe zeigt nur 1. und letzte instanz Java Basics - Anfänger-Themen 2
V einfach verkettete Listen Java Basics - Anfänger-Themen 10
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
N Erste Schritte HelloWorld möchte einfach nicht laufen Java Basics - Anfänger-Themen 11
K Programm stoppt einfach ohne Grund Java Basics - Anfänger-Themen 4
N Best Practice Doppelte und einfach Anführungsstriche in Runtime.getruntime().exec() Java Basics - Anfänger-Themen 6
O Exception behandlung einfach Ueben mit Fakt! Java Basics - Anfänger-Themen 10
Hanschyo Programm schließt sich einfach Java Basics - Anfänger-Themen 2
S Einfach verkette Liste Java Basics - Anfänger-Themen 27
Hacer Operationen einfach verketteter Listen Java Basics - Anfänger-Themen 22
C Methoden Einfach verkette Liste - int Werte aufsteigend sortieren Java Basics - Anfänger-Themen 1
V Codezeile wird einfach nicht ausgeführt Java Basics - Anfänger-Themen 23
M Quadrat zeichnen einfach bitte! Java Basics - Anfänger-Themen 2
J Einfach verkettet List: Ausgabe ohne null Java Basics - Anfänger-Themen 11
N Einfacher Rechner (für mich nicht so einfach) Java Basics - Anfänger-Themen 5
M Array in ein Array übertragen (möglichst einfach) Java Basics - Anfänger-Themen 6
T Input/Output Daten/Objekte einfach speichern Java Basics - Anfänger-Themen 5
R Methoden... ich vesteh sie einfach nicht Java Basics - Anfänger-Themen 15
llabusch Verkette Listen - Einfach und Doppelt Java Basics - Anfänger-Themen 3
C Erste Schritte Problem mit der Division von Koeffizienten... oder einfach nur irgendwlechen zahlen Java Basics - Anfänger-Themen 10
D Klassen Klassen, Objekte, Konstruktor - einfach erklärt Java Basics - Anfänger-Themen 12
B Variable wird einfach so wieder auf "null" gesetzt Java Basics - Anfänger-Themen 12
T Elemente im Vector werden einfach überschrieben! Java Basics - Anfänger-Themen 3
S ich begreife es einfach nicht -> zweck der Schnittstellen Java Basics - Anfänger-Themen 27
J Interface Wie funktioniert das mit den Interfaces. Ich verstehe es einfach nicht! :( Java Basics - Anfänger-Themen 15
W Java-Programm als Icon mit Doppelklick einfach öffnen ? Java Basics - Anfänger-Themen 3
M Layout einfach bilden Java Basics - Anfänger-Themen 4
I Weiß einfach nicht mehr weiter... Java Basics - Anfänger-Themen 3
O Wie kann man das einfach lösen? (dynamisch viele Attribute) Java Basics - Anfänger-Themen 6
A If-Schleife spinnt - ganz einfach Code - Riesen Problem :) Java Basics - Anfänger-Themen 9
Luk10 einfach animation Java Basics - Anfänger-Themen 2
E JMC - Dlls einbinden - möglichst einfach Java Basics - Anfänger-Themen 8
I einfach verkette Liste Java Basics - Anfänger-Themen 9
H Typumwandlung String --> Int (ganz einfach) Java Basics - Anfänger-Themen 9
O Observer - Einfach erklärt? Java Basics - Anfänger-Themen 5
K Ich verstehe switch einfach nicht Java Basics - Anfänger-Themen 4
M jar-Datei einfach umbenennen? Java Basics - Anfänger-Themen 8
S Filewriter schreibt einfach nicht Java Basics - Anfänger-Themen 6
G Opjektorientierte Programmierung (OOP). einfach für euch Java Basics - Anfänger-Themen 4
X WAV conversion ist einfach nicht möglich Java Basics - Anfänger-Themen 2
J jar erstellen. Es klappt einfach nicht Java Basics - Anfänger-Themen 14
L Eingeben Rechnen Ausgeben - Leider nicht so einfach Java Basics - Anfänger-Themen 31
P einfach frage zur vererbung Java Basics - Anfänger-Themen 9
G Frank A. - ports einfach öffnen und schließen Java Basics - Anfänger-Themen 3
M Caeser Verschlüsselung ganz einfach(nicht für mich) Java Basics - Anfänger-Themen 6
L while wird einfach übersprungen? Java Basics - Anfänger-Themen 4
D einfach berechnung einer onlinezeit Java Basics - Anfänger-Themen 25
B Thread will einfach nicht stoppen Java Basics - Anfänger-Themen 12
B Packages einfach kopieren? Java Basics - Anfänger-Themen 13
N Mein Applet findet -online- einfach die Klasse nicht ! Java Basics - Anfänger-Themen 6
S Java rundet einfach auf 0 Java Basics - Anfänger-Themen 2
L Ein Bild auf ein JFrame legen. nicht so einfach? =( Java Basics - Anfänger-Themen 11
M Tablelayout einbinden - ich schaff's einfach nicht Java Basics - Anfänger-Themen 16
D Button Text will einfach nicht erscheinen Java Basics - Anfänger-Themen 6
M Methoden. ich versteh das einfach nicht! Bitte helfen! Java Basics - Anfänger-Themen 4
H Kann man in Java einfach einen Beep erzeugen Java Basics - Anfänger-Themen 2
C einfach aber komisch Java Basics - Anfänger-Themen 5
P Restart Button für einfach Applikation Java Basics - Anfänger-Themen 7
H RAF geht einfach nicht Java Basics - Anfänger-Themen 12
D RegEx Probleme - wahrscheinlich zu einfach. Java Basics - Anfänger-Themen 2
H Einfach Datenübergabe Java Basics - Anfänger-Themen 4
S RegEx Syntax - ich verstehe sie einfach nicht! Java Basics - Anfänger-Themen 3
V Teil eines Programms funktioniert einfach nicht Java Basics - Anfänger-Themen 2
V If Schleife wird beim ausführen einfach ignoriert Java Basics - Anfänger-Themen 4
D Einfach Leerzeile einfügen ? Java Basics - Anfänger-Themen 2
G Owner von JDialog;Komme einfach nicht weiter Java Basics - Anfänger-Themen 4
B Applet geht einfach nicht Java Basics - Anfänger-Themen 16
S UIManager kann einfach nicht aufgelöst werden Java Basics - Anfänger-Themen 4
R Einfach if-Abfrage Java Basics - Anfänger-Themen 7
B Eine Linie zeichnenmit Java, ich verstehe das einfach nicht Java Basics - Anfänger-Themen 4
A Einfach, gut erklärte Übungen!!! Java Basics - Anfänger-Themen 3
M Verkettete Liste Java Basics - Anfänger-Themen 1
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
R Rückgabe: verkettete Liste Java Basics - Anfänger-Themen 2
B Verkettete Liste durchgehen und einzelne Elemente in neue Liste tun Java Basics - Anfänger-Themen 9
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
A Doppelt verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 17
D Doppelt Verkettete Zirkular-Liste Java Basics - Anfänger-Themen 1
A Verkettete Liste Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben