2.7Phonetische Vergleiche *
Bei der equals(…)-Methode ist das Ergebnis nur dann true, wenn beide Zeichenketten absolut gleich sind, also jedes Zeichen »passt«. equalsIgnoreCase(…) ist schon etwas großzügiger, und hier sind etwa »vuvuzela« und »VuVuZeLa« gleich. Noch entspanntere Vergleiche erlauben Collator-Objekte, die etwa den Umlauten die Punkte nehmen, sodass »männo« und »manno« dann gleich sind.
Vergleiche aufgrund von Ähnlichkeiten und gleichem »Klang« gibt es jedoch in der Java-Standardbibliothek nicht. Das ist aber bei Namen interessant. Mein Name »Ullenboom« wird oft zu »Uhlenbohm« umgebaut, was sich im Prinzip gleich anhört (und jeder Maier, Meyer, Mayer, Meir, Myer, Meier kennt das Problem).
Zur Erkennung helfen besondere String-Algorithmen weiter. Für (insbesondere englische) Namen sind der Soundex-Algorithmus und seine Verbesserungen (Double) Metaphone entwickelt worden. Wer eine Realisierung in Java sucht, der findet bei Apache Commons Codec (http://commons.apache.org/proper/commons-codec/userguide.html) passende Implementierungen. So liefert etwa isDoubleMetaphoneEqual(String value1, String value2) einen Wahrheitswert, der aussagt, ob die Strings ähnlich sind. Interessant sind die Algorithmen auch für Korrekturhilfen.[ 30 ](Wobei ich die Korrekturvorschläge »Ullendorf«, »Quellenbox«, »Patrouillenboot« und »Müllenborn« in den Textboxen von Google Chrome schon sehr schräg finde.) Der Name "Ullenboom" ist dem Soundex-Code U451 zugeordnet. Schreibt jemand diesen Namen falsch, etwa "Uhlenbohm", und ist dieser Name nicht im Wörterbuch, so berechnet das Programm von "Uhlenbohm" ebenfalls den Soundex und kommt auf U451. Ein Blick in die Datenstruktur bei U451 liefert dann den korrekten Namen "Ullenboom" oder andere Vorschläge, die den gleichen Soundex ergeben.
Wie ähnlich denn nun Strings sind, sagen andere Algorithmen. Die Levenshtein-Distanz zum Beispiel berechnet sich aus der (kleinstnötigen) Anzahl der einzufügenden, zu löschenden oder zu ersetzenden Zeichen, um von einem String zum anderen zu kommen; daher nennt sie sich auch Edit-Distanz. Von "Chris" nach "Char" ist die Edit-Distanz drei (zwei Löschungen plus eine Einfügung) und von "Ullenboom" nach "Uhlenbohm" zwei (zwei Ersetzungen). Jaro-Winkler ist ein weiterer Algorithmus, der die Ähnlichkeit zwischen 0 und 1 angibt. Das Projekt SecondString (http://secondstring.sourceforge.net/) implementiert diese Algorithmen – und noch ein Dutzend mehr.