001    package de.hska.java.aufgaben.felder;
002    
003    /**
004     * <p>Mit Anagram können zwei Zeichenketten überprüft werden, ob
005     * die eine ein Anagram der anderen ist.
006     * Ein Anagram ist ein Satz (eine Folge von Wörtern), die aus einem
007     * anderen Satz durch Umstellen der Wörter gebildet werden kann.
008     * Gross- und Kleinschreibung wird dabei nicht berücksichtigt.
009     * Ebenso sollen Leerzeichen, Tabulatoren oder ähnliche sogenannte Whitespaces
010     * nicht berücksichtigt werden.</p>
011     * <p>
012     * Beispiele für Anagramme sind:
013     *  <ul>
014     *    <li>"Desperation" -> "A Rope Ends It"</li>
015     *    <li>"Eleven plus two" -> "Twelve plus one"</li>
016     *  </ul>
017     * </p>
018     * 
019     * <p>
020     *   <a href="http://www.home.hs-karlsruhe.de/~pach0003/informatik_1/aufgaben/felder.html#anagram">Zurück zum Aufgabentext</a>
021     * </p>
022     * @author Christian Pape
023     *
024     */
025    public class Anagram {
026    
027            /**
028             * Gibt genau dann true zurück, wenn <code>anagram</code> durch
029             * Umstellen der Zeichen aus <code>satz</code> gebildet werden kann.
030             * Gross-/Kleinschreibung wird ignoriert. Ebenso werden Leerzeichen (whitespaces)
031             * nicht berücksichtigt.
032             */
033            public boolean isAnagram(String satz, String anagram) {
034                    char [] s1 = satz.toLowerCase().toCharArray();
035                    char [] s2 = anagram.toLowerCase().toCharArray();
036                    int [] h1 = new int[256];
037                    int [] h2 = new int[256];
038                    
039                    erzeugeHistogramm(s1, h1);
040                    erzeugeHistogramm(s2, h2);
041                    
042                    for (int i=0; i < 256; i++) {
043                            if (h1[i] != h2[i]) {
044                                    return false;
045                            }
046                    }
047                    
048                    return true;
049            }
050    
051            /**
052             * Erzeugt ein Histogramm über alle nicht Leerzeichen.
053             */
054            private void erzeugeHistogramm(char[] s1, int[] h1) {
055                    for (char c : s1) {
056                            if (! Character.isWhitespace(c)) {
057                                    h1[c]++;
058                            }
059                    }
060            }
061    }