001    package de.hska.java.aufgaben.interfaces;
002    
003    import java.util.Comparator;
004    
005    import de.hska.java.aufgaben.objekte.ChemischesElement;
006    
007    /**
008     * Vergleicht zwei chemische Elemente hinsichtlich ihrer
009     * Elektronennegativität.
010     * 
011     * <p>
012     *   <a href="http://www.home.hs-karlsruhe.de/~pach0003/informatik_1/aufgaben/interfaces.html#chemische_elemente_vergleichen">Zurück zum Aufgabentext</a>
013     * </p>
014     * 
015      * 
016     * @author Christian Pape
017     */
018    public class ChemischesElementComparator implements Comparator {
019    
020        /**
021         * Vergleicht zwei chemische Elemente hinsichtlich ihrer
022         * Elektronegativität. 
023         * Gibt -1 zurück, wenn <code>o1</code> kleiner (geringere Elektronegativität hat)
024         * als <code>o2</code>, 1 wenn es grösser ist und 0, wenn sie gleich sind.
025         * </p>
026         * In der Summenformel werden die Atome aufsteigend hinsichtlich
027         * ihrer Elektronegativität angeordnet:
028         * NaCl für Kochsalz, da Natrium eine geringe Elektronegativität als
029         * Chlor hat.
030         * </p>
031         * Im sogenannten Hill-System hingegen werden Elemente weitgehend
032         * lexikographisch nach ihrem Symbol angeordnet (ausser bei Kohlenstoffverbindungen,
033         * dort kommt erst C dann H, lediglich der Rest ist dann rein lexikographisch).
034         * Dies läßt sich aber nicht mehr durch einen Comparator implementieren,
035         * da bei Methodenaufruf für zwei Elemente nicht bekannt ist, ob überhaupt ein Kohlenstoffatom
036         * vorhanden ist: der Vergleich H mit Cl ist zum Beispiel dann nicht 
037         * zu berechnen. Es sei denn der Comparator hat einen Konstruktor, bei dem die Information,
038         * ob ein Kohenstoffatom vorhanden ist oder nicht mit angegeben wird.
039         */
040        public int compare(Object o1, Object o2) {
041            ChemischesElement c2 = (ChemischesElement) o2;
042            ChemischesElement c1 = (ChemischesElement) o1;
043            
044            // Beachte: Geleitkommazahlen nicht mit der Identität überprüfen
045            if ( Math.abs(c1.getElektroNegativitaet() - c2.getElektroNegativitaet()) <= 0.000000000001) {
046                return 0;
047            } else if ( c1.getElektroNegativitaet() < c2.getElektroNegativitaet()) {
048                return -1;
049            } else {
050                return 1;
051            }
052        }
053        
054    }