Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hey ich habe momentan das problem das ich Strings an vielen stellen in meinem Code vergleichen muss welche nicht case sensitive sein sollen also Baum == BAUM == baum == baUM jemand ne idee wie man das einfach und elegant umsetzen kann ?
Die Verwendung von equalsIgnoreCase und toLowerCase().equals muss nicht zum gleichen Ergebnis führen:
Java:
final String s1 = "" + (char) 73; //LATIN CAPITAL LETTER I
final String s2 = "" + (char) 304; //LATIN CAPITAL LETTER I WITH DOT ABOVE
System.out.println(String.format("s1: %s%ns2: %s", s1, s2));
System.out.println(String.format("s1.equalsIgnoreCase(s2): %s", s1.equalsIgnoreCase(s2)));
System.out.println(String.format("s1.toLowerCase().equals(s2.toLowerCase()): %s", s1.toLowerCase().equals(s2.toLowerCase())));
Code:
s1: I
s2: İ
s1.equalsIgnoreCase(s2): true
s1.toLowerCase().equals(s2.toLowerCase()): false
Ich erlaube mir hier einfach einmal ein paar mehr Details um zum einen das Verhalten zu erläutern und auch noch paar Hinweise aus der Doku zu nennen (Wie immer: Die Dokumentation vom Framework ist gut und liefert - wenn auch etwas verteilt - die notwendigen Informationen).
Ja, das liegt einfach daran, dass hier die Definition ist, dass die Codepoints einzeln verglichen werden.
Two strings are considered equal ignoring case if they are of the same length and corresponding Unicode code points in the two strings are equal ignoring case.
Two Unicode code points are considered the same ignoring case if at least one of the following is true:
The two Unicode code points are the same (as compared by the == operator)
Calling Character.toLowerCase(Character.toUpperCase(int)) on each Unicode code point produces the same result
Und Character.toLowerCase(int) gibt für beide Zeichen einfach das kleine i zurück. Daher sagt hier equalsIgnoreCase tatsächlich, dass die Zeichen gleich sind.
Und wieso kommt das nicht auch bei String.toLowerCase heraus? Hier wird halt aus einem CodePoint zwei! Das s2.toLowerCase() hat die Länge zwei. man kann sich die CodePoints anzeigen lassen und bekommt dann nicht nur die 105 (kleines i) sondern auch noch die 775. (Mit meinem Locale)
Java:
final String s2 = "" + (char) 304; //LATIN CAPITAL LETTER I WITH DOT ABOVE
System.out.println(s2.toLowerCase().length()); // 2
System.out.println(s2.toLowerCase().codePointAt(0)); // 105
System.out.println(s2.toLowerCase().codePointAt(1)); // 775
Hier ist also tatsächlich die Frage: Was wird erwartet? Wie soll sich das Programm verhalten bezüglich Akzente und so. Sollen die einfach ignoriert werden? Und wenn die beachtet werden sollen: Nach welchen Regeln? Das kann von Locale zu Locale meines Wissens nach unterschiedlich sein.
Und equalsIgnoreCase liefert hier auch direkt einen Hinweis:
Note that this method does not take locale into account, and will result in unsatisfactory results for certain locales. The Collator class provides locale-sensitive comparison.
Und da bekommt man dann auch entsprechende Ergebnisse. Ich habe jetzt nicht weitere Tests gemacht. Hat das Locale FR nicht entsprechende Regeln, die man mit Collator testen könnte? Da ich kein Französisch kann, ist das jetzt aber nur Hörensagen.