Implementieren Sie das Periodensystem chemischer Elemente mit Laden der Daten aus einer Textdatei

Schwierigkeit 2

Sie sollte zuvor die Aufgabe zu Chemischen Elementen gelöst haben, um die Java-Klasse hier wiederzuverwenden

Die chemischen Elemente sind im Periodensystem in einer Matrix angeordnet: In den Zeilen (Perioden von 1 bis 7) sind alle Elemente mit der gleichen Anzahl Schalen in der Elektronenhülle besitzen. Die Spalten ordnen die Elemente nach Gruppen (1 bis 18). Alle Elemente einer Gruppe haben ähnliche chemische Eigenschaften.

Entwerfen Sie eine Java-Klasse Periodensystem das eine Methode enthält, die zu einer Periode und Gruppe das entsprechende chemische Element zurückgibt. Bei den Lanthanoiden und Actinoide soll nur das erste Elemente dieser Gruppe zurückgegeben werden (die Textdatei s.u. enthält nur das erste Element).

Das Periodensystem existiert nur einmal in der Realität. Deswegen soll es von Ihre Klasse nur ein Objekt geben. Die Klasse implementiert also eine Menge bestehend aus einem Element, im Englischen Singleton genannt. Jeder Konstruktor Ihrer Klasse muss private sein. Das einzelne Objekt soll mit einer statischen Methode zurückgegeben werden.

Die Daten des Periodensystems sollen von einer Textdatei eingelesen werden. Die Datei "periodensystem.csv" muss im Wurzelverzeichnis des Projektordners sein (nicht in einem Paket der Klassen) - ansonsten wird es nicht gefunden. Die Daten stammen aus der englischsprachigen Wikipedia. Die Datei ist in UTF-8 Format (nur ASCII Zeichen). Falls Ihre JVM auf einem System läuft, dass eine nicht zu UTF-8 kompatibles Textformat verwendet, müssen Sie die Datei gegebenenfalls vorher konvertieren oder die Zeichensatzcodierung des Texteditors Ihrer Entwicklungsumgebung umstellen.

Benutzten Sie FileReader und BufferedReader, um die Textdaten zeilenweise einzulesen. Verwenden Sie try-catch-finally, um Ein- und Ausgabefehler zu fangen. Achten Sie darauf, dass die Datei auch im Fehlerfall immer geschlossen wird.

Die Daten der Datei sind zeilenweise angegeben, die Werte pro Element sind durch Komma separiert (CSV, comma separeted values). Sie konnen split() von String verwenden, um an die einzelnen Werte zu gelangen.

Lösung

Wandeln Sie Hexadezimalziffern auf unterschiedliche Weise in ihren Dezimalwert um und vergleichen Sie die Ausführungszeiten

Schwierigkeit 2

Ziel dieser Aufgabe ist es, die Ausführungsgeschwindigkeit einfacher Java-Berechnungen mit Hilfe von if-else, switch und einer Wertetabelle zu vergleichen.

Gegeben sei ein Interface HexadezimalZiffer, welches eine Hexadezimalziffer abstrahiert. Das Interface hat zwei Methoden:

Implementieren Sie drei verschiedene Varianten dieses Java-Interfaces: die Methoden getDezimalWert() soll

Die getDezimalWert()-Methode sollte für eine Ziffer immer wieder den Wert neu berechnen. Die Wertetabelle sollte statisch sein. Da in Java nur 16 Bit für Unicodes verwendet werden, brauch die Tabelle nur 65536 Werte enthalten: alle bis auf die gültigen Ziffer sind -1. Dieses Feld kann im static-Initializer der Klasse einmal berechnet werden. Versuchen Sie alle drei Implementierung möglichst effzient zu programmieren, aber ohne das die Lesbarkeit leidet.

Implementieren Sie eine Java-Klasse, mit der Sie die durchschnittliche Ausführungszeit der drei Implementierungen von getDezimalWert() messen. Verwenden Sie dazu System.nanoTime(). Achten Sie darauf, die Methoden möglichst oft mit unterschiedlichen Ziffern aufzurufen, um einen guten Durchschnittswert zu bekommen. Vergleichen Sie die Ergebnisse. Welche Implementierung ist schneller und warum?

Sie könnten Vererbung und abstrakte Klassen verwenden, um den Implementierungsaufwand gering zu halten. Zum Beispiel sind alle Testfälle gleich und können in einer JUnit-Testklasse gehalten werden und über Vererbung an die drei Varianten weitergegeben werden.

Lösung