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 }