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 }