В умолчанию Java API в вас есть:
String.CASE_INSENSITIVE_ORDER
Так что вам не нужно переписать компаратор, если вы должны были использовать строки с отсортированными структурами данных.
String s = "some text here";
s.equalsIgnoreCase("Some text here");
Это то, что вы хотите для чистых проверок равенства в своем собственном коде.
Просто для получения дополнительной информации обо всем, что касается равенства строк в Java. Функция хэш-код() класса 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>();
Если вы знаете, он чувствителен к регистру, можно преобразовать как в нижний регистр или верхний регистр перед сравнением. – fastcodejava
, если вы используете 's1.equalsIgnoreCase (s2)', вы можете не делать этого везде, где это необходимо. Я предлагаю вам найти, откуда взялась строка - возможно, файл или база данных или пользовательский ввод - и конвертировать в верхний регистр (или в нижний регистр) и продолжать использовать .equals для сравнения. – H2ONaCl
Не конвертируйте в нижний/верхний регистр (как предложено выше), используйте принятый подход 'equalsIgnoreCase'. Прочитайте проблему турецкого I и аналогичные проблемы Юникода для обоснования. –