001 package de.hska.java.aufgaben.sonstiges;
002
003 import java.io.BufferedReader;
004 import java.io.FileReader;
005 import java.io.IOException;
006
007 import de.hska.java.aufgaben.objekte.ChemischesElement;
008
009 /**
010 * Das Periodensystem der chemischen Elemente.
011 * Da nur ein Periodensystem in der Wirklichkeit existiert,
012 * gibt es nur ein Objekt von dieser Klasse. Die Klasse implementiert also
013 * eine Menge mit einem Element (engl. singleton).
014 * Das Objekt wird mit der statischen Methode {@link #getPeriodensystem()}
015 * zurückgeben.
016 * Die Daten für das Periodensystem werden von einer Textdatei geladen.
017 * Bei den Lathanoiden und Actinoide wird nur das erste Element verwendet.
018 *
019 * <p>
020 * <a href="http://www.home.hs-karlsruhe.de/~pach0003/informatik_1/aufgaben/sonstige.html#periodensystem">Zurück zum Aufgabentext</a>
021 * </p>
022 *
023 *
024 * @author Christian Pape
025 */
026 public class Periodensystem {
027
028 private ChemischesElement [] [] chemischeElemente = new ChemischesElement[8][19];
029
030 /**
031 * Der Name der Textdatei, die die Daten des Periodensystems als Komma-separierte
032 * Liste enthält. Diese Datei ({@value}) muss im Wurzelverzeichnis des Projekts
033 * sein, damit sie gefunden wird.
034 */
035 private static final String PERIODENSYSTEM_DATEINAME = "periodensystem.csv";
036
037 private static Periodensystem periodensystem = new Periodensystem();
038
039 /**
040 * Gibt das einzige von dieser Klasse existierende Objekt zur�ck.
041 */
042 public static Periodensystem getPeriodensystem() {
043 return periodensystem;
044 }
045
046 /**
047 * Erzeugt das Periodensystem mit Daten aus einer Textdatei.
048 * Wenn beim Öffenen oder Laden dieser Date ein Fehler auftrat,
049 * dann ist das Periodensystem <code>null</code>.
050 *
051 */
052 private Periodensystem() {
053 try {
054 ladeChemischeElemente();
055 } catch (IOException e) {
056 e.printStackTrace();
057 }
058 }
059
060 private void ladeChemischeElemente() throws IOException {
061 BufferedReader bufferedReader = null;
062 try {
063 bufferedReader = new BufferedReader(new FileReader(PERIODENSYSTEM_DATEINAME));
064
065 // Beispielzeile: 79,Gold (Aurum),Au,11,6
066 while ( bufferedReader.ready()) {
067 String element = bufferedReader.readLine();
068 String [] elementWerte = element.split(",");
069 chemischeElemente[Integer.valueOf(elementWerte[4])][Integer.valueOf(elementWerte[3])]
070 = new ChemischesElement(elementWerte[2], Integer.valueOf(elementWerte[0]));
071 }
072 } finally {
073 if (bufferedReader != null) {
074 bufferedReader.close();
075 }
076 }
077
078 }
079
080 /**
081 * Gibt das chemische Element mit der angegeben Periode (1 bis 7) und aus
082 * der Gruppe (1 bis 18) zurück. Wenn kein Element f�r diese Werte existiert,
083 * dann wird <code>null</code> zurückgegeben.
084 * Bei Lanthanide oder Aktinodien wird nur das erste Element
085 * zurückgegeben.
086 */
087 public ChemischesElement getChemischesElement(int periode, int gruppe) {
088 return chemischeElemente[periode][gruppe];
089 }
090
091 }