Collections RandomAccessfile & Linkedlist

Bob79

Mitglied
Hallo, ich hänge seit Tagen an einer Stelle fest und vielleicht hat einer von euch den umbau Tip für meinen code.

Was macht das Program?
Es liest eine CSV Datei "person.dat" ein und speichert die Werte einer Zeile in einen Objekt "person" in eine Linkedlist namens "Personen", welche aus serialisierten Objekten (pnr, pname, kst) besteht. Das funktioniert auch soweit.
Jetzt soll es in einer 2. Linkedlist ein Indexpaar aufbauen, welches den offset wert vom 0.byte (spalte 1 zeile 1) speichert und die pnr der ersten Zeile - und hier kommt der Knackpunkt - ich schaffe es nicht den Offset Zeiger richtig einzubauen so das es wie gewünscht funktioniert -> Siehe Soll/IST Ausgabe am ende des Posts.

Java:
import java.io.*;
import java.util.*;
import java.lang.Object;

public class Isam_v4 
{
	public static class Person implements Serializable
	{
		int pnr;
		String pname;
		int kst;
	}
	
	public static class Di implements Serializable
	{
		int pnr;
		long offset;
	}
	
	public static void einlesen()
	{
		List <Person> Personen = new LinkedList<Person>();
		List <Di> Isam = new LinkedList<Di>();
		
		System.out.println("");	
		System.out.println("CSV Datei person.dat wird eingelesen...");
		System.out.println("");
		
		try 
		{	
			RandomAccessFile file;
			file = new RandomAccessFile("person.dat","r");
			
			for(String line; (line = file.readLine()) != null;)
			{   
				
				String[] tmp	= line.split(";");	// CSV Werte person.dat trennen ";"
				Di idxin		= new Di();
				idxin.offset	= file.getFilePointer(); // DAS IST MEIN SORGENKIND
				idxin.pnr 		= Integer.parseInt(tmp[0]);
				Isam.add(idxin);
				Person eingabe 	= new Person();
				eingabe.pnr 	= Integer.parseInt(tmp[0]);
				eingabe.pname	= tmp[1];
				eingabe.kst		= Integer.parseInt(tmp[2]);
				/*
				System.out.println("Personal Nr.. "+eingabe.pnr);
				System.out.println("Name......... "+eingabe.pname);
				System.out.println("Kostenstelle.."+eingabe.kst);
				System.out.println(); */
				Personen.add(eingabe);
				
			}
				
			
			file.close();
			
			System.out.println("");		
			System.out.println("CSV Datei eingelesen, "+Personen.size()+" Eintraege gefunden" );
			
			System.out.println("");	
			System.out.println("Pnr ; Name ; Kostenstelle");
			System.out.println("-------------------------");	
			for (int i = 0; i < Personen.size(); i++)
			{
				Person csvaus	= new Person();
				csvaus 			= Personen.get(i);
				System.out.println(csvaus.pnr+";"+csvaus.pname+";"+csvaus.kst);
			}	
			System.out.println("");
			System.out.println(+Personen.size()+" Datensaetze ausgegeben");
			System.out.println("");
			
			System.out.println("");	
			System.out.println("Offset ; Pnr ");
			System.out.println("-------------------------");	
			for (int i = 0; i < Isam.size(); i++)
			{
				Di idxout		= new Di();
				idxout			= Isam.get(i);
				System.out.println(idxout.offset+";"+idxout.pnr);
			}	
			System.out.println("");
			System.out.println(+Isam.size()+" Datensaetze ausgegeben");
			System.out.println("");
				
		}
		catch(FileNotFoundException e)
		{
		  System.out.println("Es ist ein FileNotFoundFehler aufgetreten: "+e.getMessage());
		}
		catch(IOException f)
		{
		  System.out.println("Es ist ein IOExpeptionFehler aufgetreten: "+f.getMessage());

		}
	}
        public static void main(String[] args) throws IOException,FileNotFoundException 
	{
		BufferedReader in = new BufferedReader(
							new InputStreamReader(System.in));
		
		einlesen();
		
	}
}
Dateiname: "person.dat"
Code:
1;Max;2
2;Moritz;4
3;mry;5
4;mrx;12
IST-Ausgabe
Code:
Offset ; Pnr 
-------------------------
12;1
21;2
30;3
41;4

Soll-Ausgabe
Code:
Offset ; Pnr 
-------------------------
0;1
12;2
21;3
30;4

Hier noch infos zu meinen System:
BS: OS X 10.6.6
IDE: Jedit + shell
Code:
javac 1.6.0_22
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04-307-10M3261)
Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03-307, mixed mode)

Wenn ich den folgendes Stück code vor die "for-schleife" schiebe wird die ISAM-LinkedList nicht richtig aufgebaut...

Java:
Di idxin		= new Di();
idxin.offset	= file.getFilePointer();

Habe auch schon versucht durch andere Schleifen das passend hinzubekommen, aber ich komm irgendwie nicht drauf :(

Hier noch der API Link zur RAF




EDIT 1: War noch n copy & paste fehler drin, jetzt lässt dich code auch wieder kompilieren ;-)
EDIT 2: Anbei jetzt noch inhalt für eine Testdatei
EDIT 3: Den Java Code in den richtigen BBcode gepackt. Ist mir bei Tagedieb`s posting erst aufgefallen das ich da was falsch formatiere bzw. nicht farbig war.
 
Zuletzt bearbeitet:

tagedieb

Top Contributor
Du setzt den Offset am Ende der Zeile und nicht am Anfang.
Wenn du den Offset bei 0 startest und am Ende der Schleife den neuen Offset setzt muesste es klappen.


Java:
	RandomAccessFile file;
	file = new RandomAccessFile("person.dat","r");
	long offset = 0l;
	for(String line; (line = file.readLine()) != null; offset = file.getFilePointer())
	{   
		String[] tmp	= line.split(";");	// CSV Werte person.dat trennen ";"
		Di idxin		= new Di();
		idxin.offset	= offset; // DAS IST MEIN SORGENKIND
 

Bob79

Mitglied
Hallo tagedieb und schonmal danke für Deine Antwort, bin für jeden Lösungsansatz echt dankbar =)

Du hast es richtig erkannt, ich setze den offset Wert nach dem ersten "readLine()" welcher sich in der Schleifenbedingung befindet -> Dadurch ist der Offset immer != 0 wenn er nacher durch die Funktion "file.getFilePointer()" aufgerufen wird.

In Deinen Beispiel bleibt das Problem bestehen bzw. hab ich Deinen Lösungsansatz falsch verstanden. Hab es so gebaut wie du beschrieben hast aber immer noch nicht das gewünschte Ergebnis :(

Ich hab jetzt den code mal auf das notwendige verkürzt und so umgebaut das er den Offset richtig ausgibt, jedoch wird dann die Linkedlist nicht korrekt befüllt weil ich das Objekt "Di" nicht in der Schleife neu erzeuge (Ich glaube zumindest das es daran liegt). Hab das gefühl das ich den Wald vor lauter Bäumen nicht sehe :(


Java:
import java.io.*;
import java.util.*;
import java.lang.Object;

public class Isam_v6
{
	public static class Di implements Serializable
	{
		int pnr;
		long offset;
	}
	
	
	public static void einlesen()
	{	
		List <Di> Isam = new LinkedList<Di>();
		
		System.out.println("");	
		System.out.println("CSV Datei person.dat wird eingelesen...");
		System.out.println("");
		
		try 
		{	
			RandomAccessFile file;
			file = new RandomAccessFile("person.dat","r");
			Di idxin		= new Di();
			idxin.offset	= file.getFilePointer(); // Hiert ist der offset 0, keine zeile wurde gelesen
			System.out.println(file.getFilePointer());	
			
			for(String line; (line = file.readLine()) != null;) // file.readline speichert hier schon die erste Zeile
			{   
				idxin.offset	= file.getFilePointer(); // Hiert ist der offset 12, eine zeile wurde gelesen
				System.out.println(file.getFilePointer());	
				
				idxin.offset	= file.getFilePointer(); // DAS IST MEIN SORGENKIND
				Isam.add(idxin);
			}	
			file.close();
			System.out.println("");	
			System.out.println("Offset ; Pnr ");
			System.out.println("-------------------------");	
			for (int i = 0; i < Isam.size(); i++)
			{
				Di idxout		= new Di();
				idxout			= Isam.get(i);
				System.out.println(idxout.offset+";"+idxout.pnr);
			}	
			System.out.println("");
			System.out.println(+Isam.size()+" Datensaetze ausgegeben");
			System.out.println("");
		
				
		}
		catch(FileNotFoundException e)
		{
		  System.out.println("Es ist ein FileNotFoundFehler aufgetreten: "+e.getMessage());
		}
		catch(IOException f)
		{
		  System.out.println("Es ist ein IOExpeptionFehler aufgetreten: "+f.getMessage());

		}
	}
    
	public static void main(String[] args) throws IOException,FileNotFoundException 
	{
		einlesen();
	}
}

Ausgabe beim einlesen vermeidlich korrekt, jedoch wird falsch in die Linkedlist gespeichert, er merk sich nur den letzten offset (wiel Di nicht in der Schleife neu erzeugt wird und nur ein Objekt existiert?!) Achja das PNR im mom 0 ist leigt dadran, das ich den Teil entfernt habe um das offset Problem in den griff zu bekommen ;-)
Code:
CSV Datei person.dat wird eingelesen...

0
12
21
30
41

Offset ; Pnr 
-------------------------
41;0
41;0
41;0
41;0

4 Datensaetze ausgegeben


Meine 3. Lösungsanstätze wären
1. Noch ne Schleife irgendwie drumherumbauen, das es erledigt.
2. Die Schleifenbedingung ändern, so das ich da kein readline brauche
3. Fußgesteuerte Schleife mit passender Bedingung

Das sind so versiche die ich bisher gestartet habe aber da bin ich bisher auch auf keinen grünen Zweig gekommen.
 
Zuletzt bearbeitet:

tagedieb

Top Contributor
In Deinen Beispiel bleibt das Problem bestehen

Wenn ich meinen Code aus obigen Post verwende erhalte ich:

Code:
0
9
21
30

Der zweite Index muss 9 sein und nicht 12.


Du musst natuerlich immer ein neues DI Objekt erstellen ansonsten fuegst du immer wieder dasselbe DI der Liste hinzu. Wenn du dann den Offset setzt aenderst du alle Eintraege, da es sich ja um dasselbe Objekt handelt.
 

Bob79

Mitglied
Doh! Du hattest natürlich vollkommen recht!

Ich hab es irgendwie geschafft deinen Vorschlag so umzustetzen das es nicht geklappt hat und das trotz gepostet code, auh man. Hier so hier die fertige Komplettlösung falls jemand auf das gleiche Problem stossen sollte:

Java:
import java.io.*;
import java.util.*;
import java.lang.Object;

public class Isam_v7
{
	public static class Di implements Serializable
	{
		int pnr;
		long offset;
	}
	
	
	public static void einlesen()
	{	
		List <Di> Isam = new LinkedList<Di>();
		
		System.out.println("");	
		System.out.println("CSV Datei person.dat wird eingelesen...");
		System.out.println("");
		
		try 
		{	
			 RandomAccessFile file;
			 file = new RandomAccessFile("person.dat","r");
			 
			 long offset = 0l;
			 for(String line; (line = file.readLine()) != null; offset = file.getFilePointer())
			 {   
			 	 Di idxin        = new Di();
			 	 String[] tmp    = line.split(";");  // CSV Werte person.dat trennen ";"
			 	 idxin.offset	= offset; 
			 	 System.out.println(idxin.offset);
			 	 Isam.add(idxin);

			}	
			file.close();
			System.out.println("");	
			System.out.println("Offset ; Pnr ");
			System.out.println("-------------------------");	
			for (int i = 0; i < Isam.size(); i++)
			{
				Di idxout		= new Di();
				idxout			= Isam.get(i);
				System.out.println(idxout.offset+";"+idxout.pnr);
			}	
			System.out.println("");
			System.out.println(+Isam.size()+" Datensaetze ausgegeben");
			System.out.println("");
		
				
		}
		catch(FileNotFoundException e)
		{
		  System.out.println("Es ist ein FileNotFoundFehler aufgetreten: "+e.getMessage());
		}
		catch(IOException f)
		{
		  System.out.println("Es ist ein IOExpeptionFehler aufgetreten: "+f.getMessage());

		}
	}
    
	public static void main(String[] args) throws IOException,FileNotFoundException 
	{
		einlesen();
	}
}
Ausgabe:
Code:
CSV Datei person.dat wird eingelesen...

0
8
19
27

Offset ; Pnr 
-------------------------
0;0
8;0
19;0
27;0

4 Datensaetze ausgegeben

Dickes Danke an den Tagedieb, you`ve made my day - hab da echt schon viel Zeit an den paar Zeilen code verloren und es wären wahrscheinlich noch mehr geworden. :)

Die Abweichunge des Offset-Wers kommen durch Leerzeichen in meiner lokalen person.dat zustande.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M RandomAccessFile int und String gleichzeitig in einer Datei Java Basics - Anfänger-Themen 49
N Randomaccessfile Java Basics - Anfänger-Themen 2
G Wie gebe ich einen Dateipfad in RandomAccessFile an? Java Basics - Anfänger-Themen 2
S TextArea, RandomAccessFile, Apend und andere Tricks... Java Basics - Anfänger-Themen 7
R RandomAccessFile verständnis Problem Java Basics - Anfänger-Themen 10
D RandomAccessFile Java Basics - Anfänger-Themen 2
P RandomAccessFile writeInt() und writeChar() Java Basics - Anfänger-Themen 3
L RandomAccessFile liest nicht alle Zeichen Java Basics - Anfänger-Themen 3
D Erste Schritte RandomAccessFile "Leerzeichen" löschen Java Basics - Anfänger-Themen 6
F Kann RandomAccessFile Zip Datei lesen? Java Basics - Anfänger-Themen 14
B Klassen RandomAccessFile Java Basics - Anfänger-Themen 7
M Frage zur Klasse RandomAccessFile Java Basics - Anfänger-Themen 8
cosmic Frage zu der RandomAccessFile Klasse Java Basics - Anfänger-Themen 6
K RandomAccessFile Java Basics - Anfänger-Themen 4
T RandomAccessFile - Wie schreibe ich etwas in eine txt Datei? Java Basics - Anfänger-Themen 5
C RandomAccessFile vs. Streams Java Basics - Anfänger-Themen 5
D text dateien mit RandomAccessFile manipulieren Java Basics - Anfänger-Themen 6
T RandomAccessFile und der Dateipfad Java Basics - Anfänger-Themen 2
J RandomAccessFile löschen Java Basics - Anfänger-Themen 2
M RandomAccessFile Java Basics - Anfänger-Themen 3
G RandomAccessFile, FileChannel, MappedByteBuffer Java Basics - Anfänger-Themen 12
P Datei mit RandomAccessFile einlesen Java Basics - Anfänger-Themen 14
M RandomAccessFile schreibt Sonderzeichen vor String Java Basics - Anfänger-Themen 2
R RandomAccessFile mit anderen Streams verbinden Java Basics - Anfänger-Themen 5
J File, RandomAccessFile File wird größer Java Basics - Anfänger-Themen 8
J RandomAccessFile schreibt falsch Java Basics - Anfänger-Themen 2
G RandomAccessFile Java Basics - Anfänger-Themen 20
R RandomAccessFile Java Basics - Anfänger-Themen 4
R RandomAccessFile und ObjectoutputStream Java Basics - Anfänger-Themen 2
T RandomAccessFile erzeugt seltsame Zeichen Java Basics - Anfänger-Themen 2
P RandomAccessFile Java Basics - Anfänger-Themen 2
L RandomAccessFile und readChar readByte Java Basics - Anfänger-Themen 2
D konvertierungsprobleme bei RandomAccessFile Java Basics - Anfänger-Themen 4
L RandomAccessFile - Prob Java Basics - Anfänger-Themen 4
N RandomAccessFile(File, String) erstellt datei?! Java Basics - Anfänger-Themen 6
B RandomAccessFile Java Basics - Anfänger-Themen 12
M RandomAccessFile liest nur jeden zweiten Wert aus! Java Basics - Anfänger-Themen 8
G RandomAccessFile Java Basics - Anfänger-Themen 2
O RandomAccessFile komisch zeichen Java Basics - Anfänger-Themen 7
A RandomAccessFile Java Basics - Anfänger-Themen 7
B String in ein RandomAccessFile einfügen (bestimmte Position) Java Basics - Anfänger-Themen 4
A LinkedList implementieren Java Basics - Anfänger-Themen 32
M Wie kann ich den Index i von einer LinkedList überprüfen? Java Basics - Anfänger-Themen 36
Düsseldorf2002 Datentypen Verschachtelte LinkedList Java Basics - Anfänger-Themen 5
Düsseldorf2002 Datentypen Zwei dimensionale LinkedList Java Basics - Anfänger-Themen 8
B Warteschlange erstellen mit LinkedList ? Java Basics - Anfänger-Themen 6
U Objekte in LinkedList löschen und editieren Java Basics - Anfänger-Themen 14
G Java LinkedList remove Methode Java Basics - Anfänger-Themen 5
G Java LinkedList Java Basics - Anfänger-Themen 6
U Objekte in einer LinkedList sortieren Java Basics - Anfänger-Themen 5
S Eigene LinkedList Klasse Java Basics - Anfänger-Themen 4
S Mit einer LinkedList vorwärts und rückwärts iterieren Java Basics - Anfänger-Themen 6
S Endlosschleife beim Ausgeben einer LinkedList Java Basics - Anfänger-Themen 2
G Java LinkedList Java Basics - Anfänger-Themen 3
B LinkedList add-Methode Java Basics - Anfänger-Themen 10
F Windows in LinkedList registrieren Java Basics - Anfänger-Themen 3
A Hilfe, LinkedList Java Basics - Anfänger-Themen 2
H Knoten-Reihenfolge einer LinkedList invertieren Java Basics - Anfänger-Themen 11
H linkedlist generische klassen Java Basics - Anfänger-Themen 169
O Hashmap, ArrayList, LinkedList Java Basics - Anfänger-Themen 7
P Quellcode LinkedList Java Basics - Anfänger-Themen 2
F Collection Aufgabe mit LinkedList Java Basics - Anfänger-Themen 3
N Hilfe bei verknüpfter Liste - Linkedlist Java Basics - Anfänger-Themen 11
P Datentypen LinkedList: Kopie behält Referenz? Java Basics - Anfänger-Themen 3
C ArrayList vs LinkedList vs ? Java Basics - Anfänger-Themen 15
C LinkedList vs. ArrayList Java Basics - Anfänger-Themen 15
O LinkedList zu ArrayList Java Basics - Anfänger-Themen 4
M LinkedList elemente löschen Java Basics - Anfänger-Themen 2
L Problem mit LinkedList Java Basics - Anfänger-Themen 3
F In LinkedList einen Wert ersetzen oder neu einfügen Java Basics - Anfänger-Themen 7
P Hashmap anstatt LinkedList? Java Basics - Anfänger-Themen 6
TechGirl LinkedList - kurze allgemeine Frage Java Basics - Anfänger-Themen 17
B generische LinkedList nach Häufigkeit der Elemente füllen Java Basics - Anfänger-Themen 6
L LinkedList Comparable < > MEHRFACH implementieren? Java Basics - Anfänger-Themen 3
S LinkedList mit Input vergleichen. Java Basics - Anfänger-Themen 5
C Bei der LinkedList auf Palindrom überprüfen Java Basics - Anfänger-Themen 4
F Element aus LinkedList löschen Java Basics - Anfänger-Themen 3
A LinkedList: Probleme beim Auslesen Java Basics - Anfänger-Themen 2
T Collections LinkedList<LinkedList<T>> - Implementierung Java Basics - Anfänger-Themen 10
S Jfreechart mit LinkedList befüllen Java Basics - Anfänger-Themen 1
S JTable LinkedList <Objekt> befüllen Java Basics - Anfänger-Themen 1
K LinkedList aus Arrays ( Lösungsraum Mastermind ) Java Basics - Anfänger-Themen 5
Z Compiler-Fehler LinkedList Fragen Java Basics - Anfänger-Themen 4
K Methoden Probleme mit LinkedList.remove(object) Java Basics - Anfänger-Themen 1
Farbenfroh int in LinkedList einsortieren Java Basics - Anfänger-Themen 4
W Klassen LinkedList funktioniert nicht Java Basics - Anfänger-Themen 6
X LinkedList - Index eines Objekts Java Basics - Anfänger-Themen 2
S Strings in eine LinkedList schreiben und auslesen? Java Basics - Anfänger-Themen 4
D Sortieren von int Werten von Objekten in einer LinkedList, kann nicht auf int Werte zugreifen Java Basics - Anfänger-Themen 3
F Eigene LinkedList - toString Java Basics - Anfänger-Themen 10
T Datentypen gleichmäßiges mischen von 2 LinkedList Java Basics - Anfänger-Themen 3
S Dateien/LinkedList/StringBuffer - SOrtierung klappt nicht so ganz Java Basics - Anfänger-Themen 2
J Datentypen Array von einer LinkedList Java Basics - Anfänger-Themen 5
R LinkedList Java Basics - Anfänger-Themen 8
J Per I/O Streams in LinkedList oder ArrayList schreiben/lesen Java Basics - Anfänger-Themen 6
B LinkedList remove Java Basics - Anfänger-Themen 5
J statische Methoden auf eine LinkedList initialisieren? Java Basics - Anfänger-Themen 5
G Hausaufgabe mit LinkedList und LinkedListStack verstehen Java Basics - Anfänger-Themen 6
N LinkedList-checkForComodification Java Basics - Anfänger-Themen 11
N LinkedList Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben