Я создал программу на Java для сравнения двух строк:
String s1 = "Hello";
String s2 = "hello";
if (s1.equals(s2)) {
System.out.println("hai");
} else {
System.out.println("welcome");
}
Он отображает «добро пожаловать». Я так понимаю, это чувствительно к регистру. Но моя проблема в том, что я хочу сравнить две строки без учета регистра. Т.е. ожидаю на выходе hai
.
java
string
comparison
case-insensitive
user268018
источник
источник
s1.equalsIgnoreCase(s2)
вы можете не делать это везде, где это необходимо. Я предлагаю вам найти, откуда берется строка - возможно, из файла, базы данных или пользовательского ввода - и преобразовать ее в верхний (или нижний) регистр и продолжать использовать .equals для сравнения.equalsIgnoreCase
подход. Прочтите о проблеме турецкого языка I и аналогичных проблемах с Unicode для обоснования.equalsIgnoreCase
в любом случае возвращает неправильное значение для турецкого языка, потому что он возвращает true для сравнения «i» и «I», даже если он должен возвращать false. Так что я подозреваю, что если вы хотите принять во внимание региональные стандарты, лучше всего использовать aCollator
.toLowerCase
/toUpperCase
для всей строки и выполнение для каждого символа также дает два разных результата.Ответы:
s1.equalsIgnoreCase(s2)
: (см. Javadoc )s1.equals(s2)
источник
Используйте
String.equalsIgnoreCase()
.Используйте справочник по Java API, чтобы найти такие ответы:
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/
источник
String.equalsIgnoreCase
это наиболее практичный выбор для простого сравнения строк без учета регистра.Однако следует помнить, что этот метод не выполняет ни полного сворачивания, ни декомпозиции, и поэтому не может выполнять сопоставление без регистра, как указано в стандарте Unicode. Фактически, API-интерфейсы JDK не предоставляют доступа к информации о символьных данных сворачивания регистра, поэтому эту работу лучше всего делегировать проверенной сторонней библиотеке.
Это библиотека ICU , и вот как можно реализовать утилиту для сравнения строк без учета регистра:
Наивное сравнение с
String.equalsIgnoreCase
, илиString.equals
на прописные или нижний регистр строк не получится даже этот простой тест.(Обратите внимание, что предопределенный вариант сворачивания регистра не
getNFKCCasefoldInstance
зависит от локали; для турецких языковUCharacter.foldCase
может потребоваться немного больше работы .)источник
Вы должны использовать
compareToIgnoreCase
методString
объекта.if (compareValue == 0)
это означаетstr1
равныхstr2
.источник
Теперь он выведет:
hai
источник
В Java API по умолчанию у вас есть:
Таким образом, вам не нужно переписывать компаратор, если вы использовали строки с сортированными структурами данных.
Это то, что вы хотите для проверки чистого равенства в вашем собственном коде.
Просто для получения дополнительной информации обо всем, что касается равенства строк в Java. Функция hashCode () класса java.lang.String "чувствительна к регистру":
Поэтому, если вы хотите использовать Hashtable / HashMap со строками в качестве ключей, а такие ключи, как «SomeKey», «SOMEKEY» и «somekey», будут рассматриваться как равные, тогда вам придется обернуть свою строку в другой класс (вы не можете расширить String, поскольку это последний класс). Например :
а затем используйте его как таковой:
источник
Обратите внимание, что вы также можете выполнить для них нулевую проверку, прежде чем выполнять свои .equals или .equalsIgnoreCase.
Нулевой объект String не может вызывать метод equals.
то есть:
источник
if (str1 == null || str2 == null) return false;
.if (str1 == str2) return true;
которая обслуживает нули, а также сокращает случай, когда две строковые ссылки относятся к одному и тому же строковому объекту.Используйте
s1.equalsIgnoreCase(s2)
: https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String) .источник
Вы можете использовать equalsIgnoreCase
источник
Подробнее о строке можно найти в Учебниках по классам String и String.
источник
Чтобы быть нулевым, вы можете использовать
или
источник
источник