Ответ 1
- Лучше всего использовать
s1.equalsIgnoreCase(s2)
: (см. javadoc) - Вы также можете преобразовать их в верхний/нижний регистр и использовать
s1.equals(s2)
Я создал программу Java для сравнения двух строк:
String s1 = "Hello";
String s2 = "hello";
if (s1.equals(s2)) {
System.out.println("hai");
} else {
System.out.println("welcome");
}
Отображается "welcome". Я понимаю, что он чувствителен к регистру. Но моя проблема в том, что я хочу сравнить две строки без чувствительности к регистру. То есть Я ожидаю, что результат будет hai
.
s1.equalsIgnoreCase(s2)
: (см. javadoc)s1.equals(s2)
использовать String.equalsIgnoreCase()
Используйте ссылку API Java, чтобы найти ответы, подобные этим.
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String)
Вы должны использовать метод compareToIgnoreCase
объекта String
.
int compareValue = str1.compareToIgnoreCase(str2);
if (compareValue == 0)
это означает, что str1
равно str2
.
String.equalsIgnoreCase
- самый практичный выбор для наивного беззнакового сравнения строк.
Тем не менее, хорошо знать, что этот метод не выполняет ни полного сгибания, ни декомпозиции, и поэтому не может выполнять сопоставление без содержания, как указано в стандарте Unicode. На самом деле API JDK не обеспечивают доступ к информации о символьных данных фальцовки случая, поэтому это задание лучше всего делегировать проверенной и проверенной сторонней библиотеке.
Эта библиотека ICU, и вот как можно реализовать утилиту для сравнения строк без учета регистра:
import com.ibm.icu.text.Normalizer2;
// ...
public static boolean equalsIgnoreCase(CharSequence s, CharSequence t) {
Normalizer2 normalizer = Normalizer2.getNFKCCasefoldInstance();
return normalizer.normalize(s).equals(normalizer.normalize(t));
}
String brook = "flu\u0308ßchen";
String BROOK = "FLÜSSCHEN";
assert equalsIgnoreCase(brook, BROOK);
Наивное сравнение с String.equalsIgnoreCase
, или String.equals
в строках с верхним или нижним регистром приведет к провалу даже этого простого теста.
(Помните, что предопределенный фальшивый аромат случая getNFKCCasefoldInstance
не зависит от локали, а для турецких локалей - немного больше работы с UCharacter.foldCase
.
import java.lang.String; //contains equalsIgnoreCase()
/*
*
*/
String s1 = "Hello";
String s2 = "hello";
if (s1.equalsIgnoreCase(s2)) {
System.out.println("hai");
} else {
System.out.println("welcome");
}
Теперь он выведет: hai
В стандартном Java API у вас есть:
String.CASE_INSENSITIVE_ORDER
Поэтому вам не нужно переписывать компаратор, если вы должны использовать строки со Сортированными структурами данных.
String s = "some text here";
s.equalsIgnoreCase("Some text here");
Это то, что вы хотите для чистых проверок равенства в своем собственном коде.
Просто для дополнительной информации обо всем, что касается равенства строк в Java. Функция hashCode() класса java.lang.String "чувствительна к регистру":
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
Итак, если вы хотите использовать Hashtable/HashMap со строками в качестве ключей и иметь такие ключи, как "SomeKey", "SOMEKEY" и "somekey", считаются равными, вам придется обернуть строку в другой класс ( вы не можете расширить String, так как это окончательный класс). Например:
private static class HashWrap {
private final String value;
private final int hash;
public String get() {
return value;
}
private HashWrap(String value) {
this.value = value;
String lc = value.toLowerCase();
this.hash = lc.hashCode();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o instanceof HashWrap) {
HashWrap that = (HashWrap) o;
return value.equalsIgnoreCase(that.value);
} else {
return false;
}
}
@Override
public int hashCode() {
return this.hash;
}
}
а затем использовать его как таковое:
HashMap<HashWrap, Object> map = new HashMap<HashWrap, Object>();
Обратите внимание, что вы можете сделать нулевые проверки на них, а также перед выполнением ваших .equals или .equalsIgnoreCase.
Объект null String не может вызвать метод equals.
т
public boolean areStringsSame(String str1, String str2)
{
if (str1 == null && str2 == null)
return true;
if (str1 == null || str2 == null)
return false;
return str1.equalsIgnoreCase(str2);
}
использовать s1.equalsIgnoreCase(s2)
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.Object)
Вы можете использовать equalsIgnoreCase
Подробнее о строке можно найти в String Class и String Учебники
Чтобы быть нулевым, вы можете использовать
org.apache.commons.lang.StringUtils.equalsIgnoreCase(String, String)
или
org.apache.commons.lang3.StringUtils.equalsIgnoreCase(CharSequence, CharSequence)
public boolean newEquals(String str1, String str2)
{
int len = str1.length();
int len1 = str2.length();
if(len==len1)
{
for(int i=0,j=0;i<str1.length();i++,j++)
{
if(str1.charAt(i)!=str2.charAt(j))
return false;
}`enter code here`
}
return true;
}