Как сделать сравнение строк без учета регистра? - PullRequest
108 голосов
/ 08 февраля 2010

Я создал программу на Java для сравнения двух строк:

String s1 = "Hello";
String s2 = "hello";

if (s1.equals(s2)) {
    System.out.println("hai");
} else {
    System.out.println("welcome");
}

Отображается «Добро пожаловать». Я понимаю, что это с учетом регистра. Но моя проблема в том, что я хочу сравнить две строки без учета регистра. То есть Я ожидаю, что на выходе будет hai.

Ответы [ 12 ]

164 голосов
/ 08 февраля 2010
  • Лучше всего использовать s1.equalsIgnoreCase(s2): (см. javadoc )
  • Вы также можете преобразовать их в верхний / нижний регистр и использовать s1.equals(s2)
41 голосов
/ 08 февраля 2010

использование String.equalsIgnoreCase()

Используйте ссылку на API Java, чтобы найти ответы, подобные этим.

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String)

http://java.sun.com/j2se/1.5.0/docs/api/

22 голосов
/ 23 января 2016

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.)

22 голосов
/ 01 мая 2012

Вы должны использовать метод compareToIgnoreCase объекта String.

int compareValue = str1.compareToIgnoreCase(str2);

if (compareValue == 0) это означает str1 равно str2.

10 голосов
/ 13 февраля 2014
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

4 голосов
/ 21 августа 2013

В 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>();
2 голосов
/ 09 апреля 2013

Обратите внимание, что вы, возможно, захотите выполнить нулевые проверки на них также до выполнения ваших .equals или .equalsIgnoreCase.

Нулевой объект 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);
}
1 голос
/ 08 февраля 2010

Подробнее о строке можно найти в String Class и String Tutorials

1 голос
/ 08 февраля 2010

Вы можете использовать equalsIgnoreCase

1 голос
/ 08 февраля 2010
...