﻿Hallo alle Zusammen.

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
