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    }