Ich habe ein Java-Programm erstellt, um zwei Zeichenfolgen zu vergleichen:
String s1 = "Hello";
String s2 = "hello";
if (s1.equals(s2)) {
System.out.println("hai");
} else {
System.out.println("welcome");
}
Es wird "Willkommen" angezeigt. Ich verstehe, dass zwischen Groß- und Kleinschreibung unterschieden wird. Mein Problem ist jedoch, dass ich zwei Zeichenfolgen ohne Groß- und Kleinschreibung vergleichen möchte. Dh ich erwarte die Ausgabe hai
.
java
string
comparison
case-insensitive
user268018
quelle
quelle
s1.equalsIgnoreCase(s2)
Sie es möglicherweise nicht überall tun, wo es getan werden muss. Ich schlage vor, dass Sie herausfinden, woher die Zeichenfolge stammt - möglicherweise aus einer Datei, einer Datenbank oder einer Benutzereingabe - und entweder in Groß- oder Kleinbuchstaben konvertieren und weiterhin .equals für den Vergleich verwenden.equalsIgnoreCase
Ansatz. Lesen Sie das türkische I-Problem und ähnliche Unicode-Probleme zur Begründung.equalsIgnoreCase
gibt ohnehin den falschen Wert für Türkisch zurück, da für den Vergleich von "i" und "I" true zurückgegeben wird, obwohl false zurückgegeben werden sollte. Ich vermute also, dass a der richtigeCollator
Weg ist , wenn Sie Gebietsschemas berücksichtigen möchten .toLowerCase
/toUpperCase
für die gesamte Zeichenfolge und das Ausführen pro Zeichen führt auch zu zwei unterschiedlichen Ergebnissen.Antworten:
s1.equalsIgnoreCase(s2)
: (siehe javadoc )s1.equals(s2)
quelle
Verwenden Sie
String.equalsIgnoreCase()
.Verwenden Sie die Java-API-Referenz, um Antworten wie diese zu finden:
https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String)
https://docs.oracle.com/javase/1.5.0/docs/api/
quelle
String.equalsIgnoreCase
ist die praktischste Wahl für einen naiven Vergleich von Zeichenfolgen ohne Berücksichtigung der Groß- und Kleinschreibung.Es ist jedoch gut zu wissen, dass diese Methode weder eine vollständige Fallfaltung noch eine Zerlegung durchführt und daher keine falllose Übereinstimmung gemäß dem Unicode-Standard durchführen kann. Tatsächlich bieten die JDK-APIs keinen Zugriff auf Informationen zu Groß- / Kleinschreibung von Zeichendaten. Daher wird dieser Job am besten an eine bewährte Bibliothek eines Drittanbieters delegiert.
Diese Bibliothek ist eine Intensivstation , und hier ist, wie man ein Dienstprogramm für den Vergleich von Zeichenfolgen ohne Berücksichtigung der Groß- und Kleinschreibung implementieren kann:
Ein naiver Vergleich mit
String.equalsIgnoreCase
oderString.equals
mit Zeichenfolgen in Groß- oder Kleinschreibung schlägt selbst bei diesem einfachen Test fehl.(Beachten Sie jedoch, dass der vordefinierte Fallfaltungsgeschmack vom
getNFKCCasefoldInstance
Gebietsschema unabhängig ist. Für türkische Gebietsschemas istUCharacter.foldCase
möglicherweise etwas mehr Arbeit erforderlich.)quelle
Sie müssen die
compareToIgnoreCase
Methode desString
Objekts verwenden.if (compareValue == 0)
es bedeutetstr1
gleichstr2
.quelle
Jetzt wird ausgegeben:
hai
quelle
In der Standard-Java-API haben Sie:
Sie müssen also keinen Komparator neu schreiben, wenn Sie Zeichenfolgen mit sortierten Datenstrukturen verwenden möchten.
Ist das, was Sie für reine Gleichheitsprüfungen in Ihrem eigenen Code wollen.
Nur um weitere Informationen über alles zu erhalten, was die Gleichheit von Strings in Java betrifft. Die hashCode () -Funktion der java.lang.String-Klasse "unterscheidet zwischen Groß- und Kleinschreibung":
Wenn Sie also eine Hashtable / HashMap mit Zeichenfolgen als Schlüssel verwenden möchten und Schlüssel wie "SomeKey", "SOMEKEY" und "somekey" als gleich angesehen werden sollen, müssen Sie Ihre Zeichenfolge in eine andere Klasse einschließen (Sie können sie nicht erweitern String, da es sich um eine letzte Klasse handelt). Zum Beispiel :
und dann als solches verwenden:
quelle
Beachten Sie, dass Sie möglicherweise auch Nullprüfungen durchführen möchten, bevor Sie .equals oder .equalsIgnoreCase ausführen.
Ein Null-String-Objekt kann keine equals-Methode aufrufen.
dh:
quelle
if (str1 == null || str2 == null) return false;
.if (str1 == str2) return true;
der beide Nullen enthalten, und den Fall verkürzen, in dem sich die beiden Zeichenfolgenreferenzen auf dasselbe Zeichenfolgenobjekt beziehen.Sie können equalsIgnoreCase verwenden
quelle
Mehr über Zeichenfolge finden Sie in String - Klasse und String Tutorials
quelle
Um null sicher zu sein, können Sie verwenden
oder
quelle
Verwenden Sie
s1.equalsIgnoreCase(s2)
: https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String) .quelle
quelle