Forum: Algorithmen, Datenstrukturen und Klassendesign
by Sir Rufo,
12. Dez 2014
Ja, der StringBuilder ist nur schneller und rührt nicht so im Speicher herum.
LStr := '';
for LIdx := 1 to 1000 do
LStr := LStr + 'a';
Result := LStr;
ist analog zu
LSB := TStringBuilder.Create();
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Sir Rufo,
12. Dez 2014
0 INDI @foo@
Ist nicht falsch, aber in dem Kontext unsinnig.
0 NOTE @foo@
macht schon mehr Sinn
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Sir Rufo,
12. Dez 2014
Ich glaube ich habe bei der Beschreibung des Zeilenaufbaus einen kleinen Fehler gemacht.
So ist die korrekte Logik für die Zeile
<LEVEL> -- <SEP> -+- <TYPE> -- <SEP> -+- <DATA> ---+- <EOL>
| +- <REFTO> --+
+- <REF> -- <SEP> -- <TYPE> ------- <EOL>
Wenn die Zeile also eine Referenz ist
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Sir Rufo,
12. Dez 2014
@Jumpy
Nein habe ich nicht, denn dafür wird bei einem Referenz-Verweis auch ein TRefNode erstellt mit direktem Zugriff auf die referenzierte Node (müsste noch leicht verfeinert werden).
Auf jeden Fall kann man gleich prüfen, ob man diese Referenz schon gespeichert hat, wenn nicht speichert man die.
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Sir Rufo,
12. Dez 2014
@Jumpy
Der Inhalt der Datei ist wie ein Baum aufgebaut. Ich überführe nur den Inhalt 1:1 in eine entsprechend auswertebare Struktur.
Mehr mache ich nicht.
Ausserdem muss man im Zweifelsfall erst die gesamte Datei ausgelesen haben, um auf die Referenzen auch zugreifen zu können.
Hier ein Auszug aus https://code.google.com/p/geddiff/source/browse/trunk/lib/gedcom-ruby/samples/royal.ged...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Sir Rufo,
12. Dez 2014
Eigentlich habe ich doch recht sprechenden Quelltext:
// Wenn der Data-String mit einem @ startet, dann ist es eine Referenz
Result.DataIsReference := Result.Data.StartsWith( '@' );
Wenn man sich die Sätze anschaut, dann sind die alle nach dem gleichen Muster gestrickt
<LEVEL><sep><TYPE>
<LEVEL> = numerisch
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Sir Rufo,
11. Dez 2014
Also das hier lädt mir eine komplette StressTest-Demo-Datei ein
procedure TGedFile.LoadFromFile( const Filename: string );
var
LValue: TDataRecord;
LCurrent: TNode;
LCurrentIdx: Integer;
LLines: TStringList;
LLine: string;
begin
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Sir Rufo,
11. Dez 2014
Die GEDCOM-Datei ist aber nun mal in einer Baum-Struktur abgelegt. Um das vernünftig aufbrechen zu können packt man den Dateiinhalt in so einen Baum und kann sich dann aus diesem Baum einfach bedienen.
Der Baum ist nur für das Einlesen gedacht. Kann aber, wenn der Baum durch die Daten befüllt wird auch dazu dienen wieder eine GEDCOM-Datei zu erstellen.
Das muss man ganz klar trennen.
...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Sir Rufo,
11. Dez 2014
Hier mal so ein Minimalprogramm zum Veranschaulichen
program dp_183093;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.Generics.Collections,
System.SysUtils;
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Sir Rufo,
11. Dez 2014
Wenn schon, dann solltest du die ganze Datei parsen. Dann beginnt es schon mal beim HEAD. Aber das ist schon der erste Knoten, die wirkliche Root-Node ist die Datei selber.
Die Zeile fängt immer mit einer Zahl an und die referenziert auf den Parent im aktuellen Kontext.
Du brauchst also schon mal ein Konstrukt, wo du immer auf die aktuelle Parents zugreifen kannst.
0 ...
// Node...