Stworzyłem program w Javie, aby porównać dwa ciągi:
String s1 = "Hello";
String s2 = "hello";
if (s1.equals(s2)) {
System.out.println("hai");
} else {
System.out.println("welcome");
}
Wyświetla „powitanie”. Rozumiem, że wielkość liter ma znaczenie. Ale moim problemem jest to, że chcę porównać dwa ciągi bez rozróżniania wielkości liter. To znaczy oczekuję, że wyjście będzie hai
.
java
string
comparison
case-insensitive
user268018
źródło
źródło
s1.equalsIgnoreCase(s2)
możesz nie zrobić tego wszędzie, gdzie trzeba. Sugeruję, aby znaleźć, skąd pochodzi ciąg - plik, baza danych lub dane wejściowe użytkownika - i przekonwertować je na wielkie (lub małe litery) i nadal używać .equals do porównania.equalsIgnoreCase
podejścia. Przeczytaj o tureckim problemie I i podobnych problemach z Unicode dla uzasadnienia.equalsIgnoreCase
zwraca nieprawidłową wartość dla tureckiego, ponieważ zwraca prawdę przy porównywaniu „i” i „I”, nawet jeśli powinien zwracać fałsz. Więc podejrzewam, że jeśli chcesz wziąć pod uwagę lokalizacje,Collator
tak naprawdę jest to najlepszy sposób.toLowerCase
/toUpperCase
na całym ciągu i zrobienie tego dla każdego znaku daje również dwa różne wyniki.Odpowiedzi:
s1.equalsIgnoreCase(s2)
: (patrz javadoc )s1.equals(s2)
źródło
Użyj
String.equalsIgnoreCase()
.Skorzystaj z dokumentacji interfejsu API języka Java, aby znaleźć takie odpowiedzi:
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/
źródło
String.equalsIgnoreCase
jest najbardziej praktycznym wyborem do naiwnego porównywania ciągów bez rozróżniania wielkości liter.Warto jednak mieć świadomość, że ta metoda nie wykonuje pełnego zwijania wielkości liter ani dekompozycji, a więc nie może wykonywać dopasowywania bez liter, jak określono w standardzie Unicode. W rzeczywistości interfejsy API JDK nie zapewniają dostępu do informacji o danych znaków zwijania wielkości liter, więc to zadanie najlepiej delegować do wypróbowanej i przetestowanej biblioteki innej firmy.
Ta biblioteka to ICU , a oto jak można zaimplementować narzędzie do porównywania ciągów bez uwzględniania wielkości liter:
Porównanie z naiwny
String.equalsIgnoreCase
, alboString.equals
na znakami pisanymi dużą lub zamienionymi na wyłącznie małe strun zawiedzie nawet ten prosty test.(Należy jednak pamiętać, że predefiniowany smak składania wielkości liter
getNFKCCasefoldInstance
jest niezależny od lokalizacji; w przypadku lokalizacji tureckichUCharacter.foldCase
może być konieczne trochę więcej pracy ).źródło
Musisz użyć
compareToIgnoreCase
metodyString
obiektu.if (compareValue == 0)
to znaczystr1
równa sięstr2
.źródło
Teraz wyświetli:
hai
źródło
W domyślnym API Java masz:
Nie ma więc potrzeby przepisywania komparatora, jeśli miałbyś używać łańcuchów z posortowanymi strukturami danych.
Jest tym, czego potrzebujesz do czystego sprawdzania równości we własnym kodzie.
Tylko dalsze informacje o wszystkim, co dotyczy równości ciągów znaków w Javie. Funkcja hashCode () klasy java.lang.String „rozróżnia wielkość liter”:
Więc jeśli chcesz użyć Hashtable / HashMap z ciągami znaków jako kluczami, a klucze takie jak „SomeKey”, „SOMEKEY” i „somekey” są postrzegane jako równe, wtedy będziesz musiał opakować swój ciąg w inną klasę (nie możesz rozszerzać String, ponieważ jest to klasa końcowa). Na przykład :
a następnie użyj go jako takiego:
źródło
Zauważ, że możesz chcieć sprawdzić je również przed wykonaniem swoich .equals lub .equalsIgnoreCase.
Obiekt String o wartości null nie może wywołać metody equals.
to znaczy:
źródło
if (str1 == null || str2 == null) return false;
.if (str1 == str2) return true;
której oba obsługują wartości null, a także skrócić przypadek, w którym dwa odwołania do ciągu odnoszą się do tego samego obiektu ciągu.Zastosowanie
s1.equalsIgnoreCase(s2)
: https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String) .źródło
Możesz użyć equalsIgnoreCase
źródło
Więcej informacji o łańcuchach można znaleźć w samouczkach dotyczących klas i ciągów znaków
źródło
Aby być nullsafe, możesz użyć
lub
źródło
źródło