Ich habe die Überschrift und Artikeleinführung zu Ihrem Titelthema
"Babylon zu fünft" gelesen.
Es fing sofort an bei mir in den Fingern zu kribbeln.
Nach der "Spezifikation der Aufgabe" machte ich mich sofort ans Werk
ein eigenes Java-Programm zu schreiben, ohne den Artikel weiter
gelesen zu haben.
Mein Ziel war es mein Programm mit den von Ihnen
dargelegten Lösungen zu vergleichen ohne vorher "beeinflusst" worden
zu sein.
Bei meiner Grundüberlegung kam ich zum Ergebnis, dass ein komplettes
Einlesen des Textes nicht optimal ist. Zwar bietet das System, auf
welchem das Programm ausgeführt werden soll, enorme Reserven, jedoch
kann ich nicht davon ausgehen, dass mein Programm das einzige ist was
zur Ausführungszeit läuft und somit nicht alle Rezourcen belegen.
Außerdem sollte dieses Programm auch auf "kleineren" Systemen ebenso
gut laufen.
Würde der Speicher nämlich nicht ausreichen und es zu einer
Auslagerung in die SWAP-Partition kommen, könnte das Programm auch
gleich den bereits bearbeiteten und fertigen Datenstrom auf die
Festplatte speichern.
Nach erfolgreichem Erstellen des Java-Codes habe ich ihn mit den
Vorschlägen verglichen und war sehr überrascht, dass überwiegend
genau umgekehrt gedacht wurde.
Es wurde der komplette Text in den Arbeitsspeicher eingelesen und
verarbeitet.
Die von Ihnen eingesetzte Datei hatte 55 MByte. Die Speicherbedarf
einzelner Programme ging bis zu 420 MBytes.
Was wäre jedoch, wenn der Text wie in Ihrer Spezifikation mehrere
hundert MBytes gehabt hätte?
Es wäre wohl eine zeitfressende Auslagerung (SWAP) nicht umgänglich
gewesen.
Zusätzlich war ich von dem Ansatz meines Java-Programmierkollegen
James Gosling, welchen ich hier an dieser Stelle gern Grüßen
möchte, überrascht die überwiegende "arbeit" des Programms in der
Methode main unterzubringen.
Ich habe die Klasse textnumbers.class so geschrieben, dass sie sich
von anderen Java-Programmen als Objekt einbinden und mit der Methode
go(String datei) ausführen lässt.
Die main-Methode nutze ich nur um die Klasse auch alleine
"ausführbar" zu machen.
Man kann sie als eine Art Startscript betrachten.
Am Ende Ihres Artikels rufen Sie die Linux-Magazin-Leser auf selber
aktiv zu werden. Verbesserungsvorschläge seien Erwünscht.
Nichts liegt wir ferner als die veröffentlichten Programmzeilen
zu verbessern.
Jedes Programm an sich ist lauffähig. Nur das ist entscheidend.
Außerdem wäre es Anmaßend zu meinen solchen Gurus etwas vormachen
zu können.
Jeder von denen kann uns alle in die berühmte Tasche stecken.
Interessant fand ich auch die Aussage von Zeev Suraski.
Der Durchlauf seines PHP Scripts würde eine verbesserte Leistung
bekommen, wenn man 1000 Zeilen einliest und dann erst verarbeitet.
Also genau der Mittelweg!
Weder alles einlesen noch nur eine Zeile.
Ist auf jeden Fall wert ausprobiert zu werden.
Nun aber zur Erklärung meines Quellcodes:
Anfangs sind sämtliche wichtigen Variablen definiert.
Nicht zwingend erforderlich, jedoch erkennt der Fachmann gleich die
gedankliche Grundstruktur des Codes.
Anschließend kommt die main-Methode, welche das schon beschriebene
alleinige Starten der Klasse ermöglicht.
Danach kommt eine typische Java-Vorgehensweise.
Nämlich das Zuweisen einiger Variablen mithilfe einer gleichnamigen
Methode wie die Klasse selbst.
Nun kommt die Methode go(String datei), welche den übergebenen
Dateinamen in ein File-Objekt umwandelt und anschließend Zeile für
Zeile ausliest, verarbeitet und wieder abspeichert.
Es wird eine zweite Datei angelegt, welche zum Speichern genutzt
wird.
Somit ist die Originaldatei sicherheitshalber noch vorhanden da
ich von hier aus unmöglich sagen kann ob sie noch gebraucht wird
oder nicht.
Im Verlauf des Methodenblocks fallen einem sofort die drei
for-Schleifen ins Auge.
Die erste durchsucht den aktuellen String nach dem Muster einer
Fußnote.
Die zweite nummeriert die gefundenen Eintragungen um.
Sie nutzt das Ergebnis der ersten und läuft "vorwärts", damit die
unbekannten und neuen Fußnoten von links nach rechts aufsteigend
durchnummeriert werden.
Die dritte Schleife nutzt ebenfalls das Ergebnis der ersten, läuft
jedoch "rückwärts".
Ein an mehreren Stellen zu editierender String muss von hinten her
bearbeitet werden, damit ein vorderer Zeichenversatz sich nicht nach
hinten fortsetzt.
Würde ein String zwei oder mehr Fußnoten beinhalten und die erste
würde von einer zweistelligen Zahl auf eine einstellige Zahl geändert,
dann würde die ermittelte Position der zweiten Fußnote nicht mehr
stimmen.
Angehängt an diese Methode findet man eine weiter, welche zum
Schreiben der bearbeiteten Strings dient.
Viele Grüße an Alle!
Have a lot of fun.
PS:
Angaben zu meiner Person.
Mein Name ist Kai Triebel, bin 31 Jahre alt und von Beruf Chemiemeister.
Ich arbeite in Göttingen in einer Firma welche Feuerfest-Produkte
herstellt.
Zusätzlich zu meiner Arbeit bin ich Selbständig und biete Dienstleistungen
in der Javaprogrammierung an (Anwendungen,
Datenbanken, ...).
Angaben zum Programm.
Der Quellcode wurde getestet mit der Java-Version 1.6.0_03