Aus Datei in verketteter Liste speichern

Status
Nicht offen für weitere Antworten.

simlmf

Mitglied
ich geb euch mal die aufgabenstellung:

a)
Die Studenten aus Aufgabenblatt 1 sollen statt in einem Array in einer verketteten
Liste gespeichert werden. Die Liste soll die Studenten nach Matrikelnummern sortiert
enthalten.
Speichern Sie zunächst mindestens 6 Studenten unsortiert in einer Datei.
Lesen Sie Studentendaten aus der Eingabedatei und fügen Sie die Studenten jeweils
in eine verkettete Liste sortiert ein. Hierbei muss zunächst die bisherige Liste
durchlaufen werden, um den geeigneten Listenplatz zu finden. Die Studenten sollen
direkt in die verkettete Liste eingetragen werden, ohne Verwendung eines Arrays.
Tipp: Durch Verwendung eines Kopfknotens vereinfacht sich die Programmierung.
Geben Sie zunächst die unsortierten Studenten auf dem Bildschirm aus.
Anschliessend soll dann die sortierte Liste ausgegeben werden.
b)
Sortieren Sie die Liste nach den Nachnamen.
Gehen Sie dazu die alte verkettete Liste durch und erstellen Sie wie in Teilaufgabe a)
eine neue sortierte Liste, die diesmal nach Nachnamen sortiert sind.
Das Programm soll in den Übungen vorgeführt und erklärt werden.

ich hab also die 6 studenten in folgender formatierung angelegt:

Mustermann
Manfred
999999
123456

Knutsen
Knut
888888
234567

usw. bis es halt 6 stück sind.

ich möchte das ganze via filereader machen, allerdings weiss ich gar nicht wie ich an die sache rangehen soll. wäre cool wenn ihr mir ein paar anregungen geben könntet.
mfg simon
 
Zuerst die Datei einlesen. Dabei für einen Studentendatensatz ein Studentenobjekt anlegen und dieses dann in die Liste packen. Anschließend die Liste noch sortieren und fertig. Ich denke zwar das war dir selber klar, aber konkreter gehts bei so einer relativ unkonkreten Fragestellung nicht, ohne die ganze Arbeit für dich zu machen.
 
das ist ja schonmal was, ich wollte das sich das hier nach und nach so entwickelt, weil ich eben nur anreize möchte, net das jmd alles für mich macht.

das erste problem ist, wie kann ich dem reader sagen er soll nur bis zb. der telefonnummer in ein neues studentenobjekt einlesen und anschliessend bis zur nächsten nummer in das 2te objekt?
ausserdem soll die liste nicht anschliessend sortiert werden sondern es soll direkt sortiert eingelesen werden
 
> wie kann ich dem reader sagen

dem Reader kannst du überhaupt nix sagen, nur dessen Operationen benutzen wie z.B. 'eine Zeile lesen'
was in den Zeilen drinsteht und wie du diese Werte an den Konstruktor übergibst ist deine Aufgabe,

ganz simpel z.B.
String x = liesZeile();
String y = liesZeile();
Student a = new Student(x,y);
 
also der reader steht soweit dass ich das zeug zeilenweise einlesen und ausgeben kann, nur wie schaffe ich es, dass er jedesmal wenn in der textdatei ein neuer student beginnt, er auch ein neues studentenobjekt anlegt.
ich bin in java noch nicht sehr bewandelt, also eher für dumme erklären.
danke
 
naja, wenn ich das vorhin verstanden hätte, hätt ich ja net nachgefragt. kannst mir das noch ein wenig genauer erklären?

hier mal der quellcode bisher:

Code:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Aufgabe3 {
	
	public static void main(String[] args){
		
		try 
		{
			BufferedReader BR = new BufferedReader(new FileReader("Studenten.txt") );
			String zeile = BR.readLine();
			
			while ( zeile != null )
			{
				System.out.println(zeile); 
				zeile = BR.readLine();
			} 
		}
		catch (IOException e) {
			System.out.println(e.getMessage());
		}
	}
}

das s.o.p ist nur für testzwecke gewesen
 
das fängt schonmal damit an, dass du mehrere String-Variablen brauchst,
nicht jede Zeile ist gleich, sondern lies immer einen Block von Zeilen in eine bestimmte Menge von Variablen ein,

noch mehr verraten möchte ich persönlich aber nicht, ist ja deine Aufgabe
 
also soll ich so wie ich das nun verstanden habe quasi für jede zeile ne variable deklarieren? da werdsch ja blöd im kopp.
oder gibt es ne möglichkeit mehrere zeilen zu einem block zusammenzufassen und in ne variable zu speichern?
 
du hast doch nur vier unterschiedliche Zeilen..
Mustermann
Manfred
999999
123456

eine Schleife über alle Einträge brauchst du immer noch,
aber pro Schleifendurchlauf nicht eine Zeile einlesen sondern einen ganzen Studenten
 
ja, aber wie kann ich diese zeilen anpsrechen. denn ich arbeite hier ja net mit zeilennummern sodass ich mit weiss der geier, modulo oder so arbeiten kann.
 
du sprichst die zeilen nicht an, du gehst sie der reihe nach durch und wenn die leerzeile gekommen ist fängt ein neuer stundent an.

fang einfach mal an zu programmieren, dann wirds klarer. les mal die datei ein und gib jede zeile mit System.out.println aus.
 
> und gib jede zeile mit System.out.println aus

das wurde doch schon gepostet 😉
 
naja, mein problem ist nach wie vor dass ich net auf den trichter komm, wie ich mit der schleife und dem reader in der lage bin herzugehen und zu sagen:

erste zeile in die variable name
zweite zeile in die variable nachname
dritte zeile in die variable tele
vierte zeile in die variable matr

speichern kann und dann hergeh und sag. wenn leerzeichen dann neuer student.
die umsetzung der lösung in aluffähigen code is mein prob
 
schau dir nochmal meinen Code an:
String x = liesZeile();
String y = liesZeile();
Student a = new Student(x,y);

ein solcher Block korrekt liest also vielleicht 4 Zeilen,
den musst du dann nur noch in einer Schleife wiederholt ausführen
und natürlich die Leerzeile bedenken
 
Code:
public class Aufgabe3 {
    
   public static void main(String[] args){ 
       
      try 
      { 
         BufferedReader br = new BufferedReader(new FileReader("Studenten.txt") );

         while ( true )
         {
            String x = liesZeile();
            String y = liesZeile();
            Student a = new Student(x,y);
         } 
      } 
      catch (IOException e) { 
         System.out.println(e.getMessage()); 
      } 
   } 
}
 
ok, dann versteh ich dahinter aber net die logik des buffered readers.
wieso liest er nun 4 zeilen ein und wo wird die leerzeile berücksichtigt. er erzeugt nun jedes mal ein studentenobjekt namens a.
und liesZeile() steht wofür bei dir?
 
liesZeile steht für das Einlesen einer Zeile

> wieso liest er nun 4 zeilen ein

das passiert genau dann, wenn du 4x den Code für liesZeile() hinschreibst,
in meinem Beispiel ist das nicht Buchstabe für Buchstabe vorgekaut

> und wo wird die leerzeile berücksichtigt

in meinem letzten Post noch nirgendwo, da musst du schon ein Gehirn einschalten
 
ich bin nun hinter das System vom buffered reader gestiegen, nun muss ich nur noch das mit den studentenobjekten machen, dann hab ich mein heutiges pensum endlich erfüllt.

sind halt noch die zeilen für testzwecke drin


Code:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Aufgabe3 {
	
	public static void main(String[] args){
		
		try 
		{
			BufferedReader BR = new BufferedReader(new FileReader("Studenten.txt") );
			String zeile = BR.readLine();
			
			while ( zeile != null )
			{
				{	 
					String liesName = BR.readLine();
					String liesVorname = BR.readLine();
					String liesTelefonnummer = BR.readLine();
					String liesMatrikelnummer = BR.readLine();
					zeile = BR.readLine();
					System.out.println(liesName +  '\n' + liesVorname + '\n' + liesTelefonnummer + '\n' + liesMatrikelnummer);
					System.out.println(zeile);
				}
				
			}  
		}
		catch (IOException e) {
			System.out.println(e.getMessage());
		}
	}
}
 
so, weiter gehts mit meinen programmierkünsten.

ich brauche ne klasse Student in der ich den studentenobjekten dann die eingelesenen werte übergebe.
würdet ihr das mit get und set-methoden machen?

hauptproblem hierbei is für mich schon immer die kommunikation zwischen den klassen und den methoden gewesen. wenn ihr also noch hintergrundwissen als tipps habt, sag ich net nein.

liebe grüsse simon
 
es gibt keine Art von Hintergrundwissen, um eine ganz simple Klasse mit simplen Eigenschaften und set + get zu programmieren,

ein Lehrbuch mit Beispielen könnte evtl. noch helfen, nach einer Woche lesen kennst du ein paar Standards,
von nix kommt aber nix
 
hauptaugenmerk lag ja auch eher darauf mit welchen methoden ich diese variablen mit werten versehe.

die getters und setters zu proggen is ja kein problem. lesen tu ich auch einiges. trotzdem brauch ich meist nen grossen anschubser damits alles ins rollen kommt.

also würdest du es mit get/set machen. würdest du nen konstruktor mit einbauen?
wie sieht das mit den parametern aus, da liegt das hauptproblem, dass ich noch net so genau weiss wann ich paras brauch und wann net
 
ich empfehle einen Konstruktor, set geht aber genauso,
get brauchst du in jedem Fall

> dass ich noch net so genau weiss wann ich paras brauch und wann net

das klingt jetzt recht allgemein, so wie 'weiß nicht wann ich etwas programmieren muss'
da solltest du mit der Regel arbeiten: man muss überhaupt nix programmieren, es sei denn das Programm ist noch nicht fertig/ die Aufgabe noch nicht gelöst
 
So das ist mal der Prototyp der Klasse NeuStudent, der übersichtlichkeit halber, mach ichs erstmal mit einer Variable

Code:
public class NeuStudent
{
	
	private String liesName;
	private String liesVorname;
	private String liesMatrikelnummer;
	private String liesTelefonnummer;
	
	public NeuStudent(String liesName)
	{
		public String getLiesName()                    //Hier ist noch ein Fehler, welcher?
		{
			return liesName;
		}
		public void setLiesName(String liesName)    // Hier erwartet er irgendwie ne {, ?
		{
			this.liesName = liesName;
		}
	}	
}

Dazu die leicht modifizierte Main-Klasse

Code:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Aufgabe3 {
	
	public static void main(String[] args){
		
		try 
		{
			BufferedReader BR = new BufferedReader(new FileReader("Studenten.txt") );
			String zeile = BR.readLine();
			
			while ( zeile != null )
			{
				{	 
					String liesName = BR.readLine();
					String liesVorname = BR.readLine();
					String liesTelefonnummer = BR.readLine();
					String liesMatrikelnummer = BR.readLine();
					NeuStudent a = new NeuStudent(liesName);
 [b]//Brauch ich hier was in der Form a = ...? das mach ich doch eigentlich in der Student Klasse via return kommts zurück[/b]
					zeile = BR.readLine();
					System.out.println(liesName +  '\n' + liesVorname + '\n' + liesTelefonnummer + '\n' + liesMatrikelnummer);
				}
				
			}  
		}
		catch (IOException e)
		{
			System.out.println(e.getMessage());
		}
	}
}
[/quote]
 
man kann nicht Operationen ineinander definieren -> Lehrbuch, einfach nur lernen eine beliebige Klasse zu schreiben..

> a = ...?
brauchst du nicht, wüßte nicht was das an dieser Stelle soll,
 
Code:
public class NeuStudent
{
	private String liesName;
	private String liesVorname;
	private String liesMatrikelnummer;
	private String liesTelefonnummer;
	
	public NeuStudent(String liesName)
	{
		this.liesName = liesName;
	}

	public String getLiesName() {
		return liesName;
	}
}

so besser?
 
[OFF TOPIC]

Das ist echt beste Thread seit langem!!


Grüße

Ein stiller Schweiger und Geniesser

[/OFF TOPIC]
 
mach dich nur über mich lustig 🙁
irgendwann programmier ich euch alle in grund und boden :###
naja, schön dass ich dich belustigen konnte


weiterhin hab ich natürlich fragen.
in der aufgabenstellung ist mir net ganz klar was der steller damit meint.

Lesen Sie Studentendaten aus der Eingabedatei und fügen Sie die Studenten jeweils
in eine verkettete Liste sortiert ein. Hierbei muss zunächst die bisherige Liste
durchlaufen werden, um den geeigneten Listenplatz zu finden. Die Studenten sollen
direkt in die verkettete Liste eingetragen werden, ohne Verwendung eines Arrays.

meint er nun dass ich die studenten erst unsortiert einlesen und anschliessend mit irgendnem algorithmus sortieren soll? anders könnt ichs mir net vorstellen.
 
kann es sein, dass euer lehrer erwaret, dass du die verkettet liste selber programmierst und nicht die von java verwendest?
 
ARadauer hat gesagt.:
kann es sein, dass euer lehrer erwaret, dass du die verkettet liste selber programmierst und nicht die von java verwendest?
Ich hoffe nicht. Soviel Gedult/Langeweile hat nichtmal SlaterB. :lol:

ms
 
Die Studenten aus Aufgabenblatt 1 sollen statt in einem Array in einer verketteten ...
hast du überhaupt das Aufgabenblatt 1 gelöst?

zum Thema sortiert in eine LinkedList einfügen

Code:
import java.util.LinkedList;



public class Test   {	

	
	LinkedList<Student> liste = new LinkedList<Student>();
	public static void main(String[] args) {
		Test t = new Test();
		//while()...hier dein zeug while usw...
			//im file lesen..
			//student erstellen
			t.insertInListe(new Student("BB")); //einfügen
			//ein paar beispiele	
			t.insertInListe(new Student("KK"));
		  t.insertInListe(new Student("CC"));
		  t.insertInListe(new Student("XX"));
		  t.insertInListe(new Student("LL"));
			t.insertInListe(new Student("AA"));		
		
		t.printListe();
			
	}	
	
	public void insertInListe(Student s){
		for(int i =0; i < liste.size(); i++){
			Student temp = liste.get(i);
			if(temp.compareTo(s)>0){
				liste.add(i,s);
				return;
			}			
		}
		liste.add(s);
	}
	public void printListe(){
		for(Student s: liste)
			System.out.println(s.getName());
	}

}
Student dazu:
Code:
	public class Student implements Comparable<Student>{
		private String name;
		private String vorname;
		private String matrikelNummer;
		private String telefonNumm;
		
		
		
		public Student(String matrikelNummer) {
			this.matrikelNummer = matrikelNummer;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public String getVorname() {
			return vorname;
		}
		public void setVorname(String vorname) {
			this.vorname = vorname;
		}
		public String getMatrikelNummer() {
			return matrikelNummer;
		}
		public void setMatrikelNummer(String matrikelNummer) {
			this.matrikelNummer = matrikelNummer;
		}
		public String getTelefonNumm() {
			return telefonNumm;
		}
		public void setTelefonNumm(String telefonNumm) {
			this.telefonNumm = telefonNumm;
		}
		
		
		public int compareTo(Student o) {
			return this.getMatrikelNummer().compareTo(o.getMatrikelNummer());
		}
		
		public String toString(){
			return getMatrikelNummer();
		}
		
	}
 
hier kommt der clou, wir dürfen keine javaklassen für diese aufgabe verwenden, find ich auch hirnrissig, aber wie man sieht isses zum verständnis von verketteten listen gar net so dumm(in meinem fall)

aufgabenblatt 1 hab ich gelöst, ja

vllt hat der ein oder andere noch n guten link zum thema listen, ich google, vor mich hin, aber irgendwie wills net in meinen schädel rein.


was mein problem angeht sind folgende.

nun brauch ich ja bevor das ganze losgeht ne liste. also brauch ich als erstes ne klasse List.

was muss diese klasse denn alles beinhalten?
der ablauf soll ja folgender sein:

liste muss erzeugt werden(main). anschliessend wird in der while schleife eingelesen und in studenten verpackt.
nun muss ich methoden definieren um bei jedem schleifendurchlauf nen neuen knoten erzeugen und mit dem aktuellen studentenobjekt befüllen.
mein problem ist, was muss ich wo reinschreiben, wie sollen die verschiedenen elemente untereinander kommunizieren.

am liebsten wäre es mir wenn ihr mir zur erläuterung beispielcode mitgeben könntet, denn anhand eines passenden beispiels versteh ich vllt die struktur ein wenig besser


wenn ich das heut und morgen bis dahin schaffe bin ich zufrieden.

gruss simon
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben