Hallo zusammen,
ich habe mir eine Klassenbibliothek geschrieben, die es mir ermöglicht, mehrere verschiedene Dateiformate einzulesen. Realisiert habe ich das ganze mittels Factory Pattern.
Jetzt möchte ich das ganze Testen und habe noch einen kleinen Fehler.
Hier meine Reader Klasse
[Java]package klassenbibliothek;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Iterator;
public class MyReader implements Iterator<String>
{
BufferedReader reader;
public MyReader(BufferedReader myReader)
{
reader = myReader;
}
@Override
public boolean hasNext()
{
try {
return reader.ready();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
@Override
public String next()
{
try {
return reader.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "error";
}
}
[/Java]
und hier eine Klasse mit main-Methode, die das ganze nutzt (soll später ein Unit Test werde).
[Java]package klassenbibliothek;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Iterator;
import org.junit.Before;
public class Main
{
public static void main(String[] args) throws FileNotFoundException
{
ArrayList<Object> resultList = new ArrayList<Object>();
String dataFileName = "C:/temp/Substances.dat";
BufferedReader bReader = new BufferedReader(new FileReader(dataFileName));
MyReader myReader = new MyReader(bReader);
while(myReader.hasNext() != false)
{
AbstractFileObjectCreator creator = new SubstancesFileObjectCreator();
while(myReader.hasNext() == true)
{
String rawValues = myReader.next();
String lineValues[] = rawValues.split("\t");
if(lineValues[0].equals("#"))
{
// file header: do nothing
}
else if(lineValues[0].equals("R"))
{
AbstractFileObject newObject = creator.createFileObject(rawValues);
String rawValues1 = myReader.next();
String lineValues1[] = rawValues1.split("\t");
if(lineValues1[0].equals("RN"))
{
while(lineValues1[0].equals("RN"))
{
Synonym newSynonym = new Synonym(lineValues1[3], lineValues1[4]);
newObject.addAppendix(newSynonym);
String rawValues2 = myReader.next();
String lineValues2[] = rawValues2.split("\t");
lineValues1[0] = lineValues2[0];
}
}
resultList.add(newObject);
}
}
}
for (int i = 0; i < resultList.size(); i++) {
System.out.println(resultList.get(i));
}
// Problem: es wird jedes zweite R überprungen!!!
}
}
[/Java]
Die Main Methode benutzt meine Reader und steckt die einzelnen Zeilen in die jeweilige creator-Methode.
Das Problem hierbei ist, das die Datensätze quasi verschachtelt sind und ich die daraus entstehenden Objekte per Komposition herstellen muss. Ein Objekt des Typs Substance verfügt über eine ArrayList in der die Synonyme gespeichert sind.
Ein Substance Datensatz hat die Kennung "R" und ein Synonym Datensatz die Kennung "RN". Das Problem hier ist das ich wenn ich auf RN prüfe
[Java]if(lineValues1[0].equals("RN"))
{
while(lineValues1[0].equals("RN"))
{
...
[/Java]
schon den nächsten Datensatz einlese, der wieder ein R sein könnte. Somit überspringe ich quasi jeden zweiten Datensatz in meiner Datei.
Weiß da jemand weiter? Bin da gerade total überfragt.
Viele Grüße
Kenelope
ich habe mir eine Klassenbibliothek geschrieben, die es mir ermöglicht, mehrere verschiedene Dateiformate einzulesen. Realisiert habe ich das ganze mittels Factory Pattern.
Jetzt möchte ich das ganze Testen und habe noch einen kleinen Fehler.
Hier meine Reader Klasse
[Java]package klassenbibliothek;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Iterator;
public class MyReader implements Iterator<String>
{
BufferedReader reader;
public MyReader(BufferedReader myReader)
{
reader = myReader;
}
@Override
public boolean hasNext()
{
try {
return reader.ready();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
@Override
public String next()
{
try {
return reader.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "error";
}
}
[/Java]
und hier eine Klasse mit main-Methode, die das ganze nutzt (soll später ein Unit Test werde).
[Java]package klassenbibliothek;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Iterator;
import org.junit.Before;
public class Main
{
public static void main(String[] args) throws FileNotFoundException
{
ArrayList<Object> resultList = new ArrayList<Object>();
String dataFileName = "C:/temp/Substances.dat";
BufferedReader bReader = new BufferedReader(new FileReader(dataFileName));
MyReader myReader = new MyReader(bReader);
while(myReader.hasNext() != false)
{
AbstractFileObjectCreator creator = new SubstancesFileObjectCreator();
while(myReader.hasNext() == true)
{
String rawValues = myReader.next();
String lineValues[] = rawValues.split("\t");
if(lineValues[0].equals("#"))
{
// file header: do nothing
}
else if(lineValues[0].equals("R"))
{
AbstractFileObject newObject = creator.createFileObject(rawValues);
String rawValues1 = myReader.next();
String lineValues1[] = rawValues1.split("\t");
if(lineValues1[0].equals("RN"))
{
while(lineValues1[0].equals("RN"))
{
Synonym newSynonym = new Synonym(lineValues1[3], lineValues1[4]);
newObject.addAppendix(newSynonym);
String rawValues2 = myReader.next();
String lineValues2[] = rawValues2.split("\t");
lineValues1[0] = lineValues2[0];
}
}
resultList.add(newObject);
}
}
}
for (int i = 0; i < resultList.size(); i++) {
System.out.println(resultList.get(i));
}
// Problem: es wird jedes zweite R überprungen!!!
}
}
[/Java]
Die Main Methode benutzt meine Reader und steckt die einzelnen Zeilen in die jeweilige creator-Methode.
Das Problem hierbei ist, das die Datensätze quasi verschachtelt sind und ich die daraus entstehenden Objekte per Komposition herstellen muss. Ein Objekt des Typs Substance verfügt über eine ArrayList in der die Synonyme gespeichert sind.
Ein Substance Datensatz hat die Kennung "R" und ein Synonym Datensatz die Kennung "RN". Das Problem hier ist das ich wenn ich auf RN prüfe
[Java]if(lineValues1[0].equals("RN"))
{
while(lineValues1[0].equals("RN"))
{
...
[/Java]
schon den nächsten Datensatz einlese, der wieder ein R sein könnte. Somit überspringe ich quasi jeden zweiten Datensatz in meiner Datei.
Weiß da jemand weiter? Bin da gerade total überfragt.
Viele Grüße
Kenelope
Zuletzt bearbeitet von einem Moderator: