Как сделать сравнение строк без учета регистра?

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

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

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

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

104 голоса | спросил user268018 8 FebruaryEurope/MoscowbMon, 08 Feb 2010 11:50:13 +0300000000amMon, 08 Feb 2010 11:50:13 +030010 2010, 11:50:13

11 ответов


0
  • Лучше всего использовать s1.equalsIgnoreCase(s2): (см. javadoc )
  • Вы также можете преобразовать их в верхний /нижний регистр и использовать s1.equals(s2)
ответил Michael Bavin 8 FebruaryEurope/MoscowbMon, 08 Feb 2010 11:52:35 +0300000000amMon, 08 Feb 2010 11:52:35 +030010 2010, 11:52:35
0

используйте 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 /документы /апи /

ответил Thirler 8 FebruaryEurope/MoscowbMon, 08 Feb 2010 11:52:20 +0300000000amMon, 08 Feb 2010 11:52:20 +030010 2010, 11:52:20
0

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

int compareValue = str1.compareToIgnoreCase(str2);

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

ответил Aliti 1 Mayam12 2012, 09:09:56
0

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 может понадобиться.)

ответил glts 23 Jpm1000000pmSat, 23 Jan 2016 19:56:06 +030016 2016, 19:56:06
0
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

ответил KNU 13 FebruaryEurope/MoscowbThu, 13 Feb 2014 13:33:11 +0400000000pmThu, 13 Feb 2014 13:33:11 +040014 2014, 13:33:11
0

В 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>();
ответил ɭɘ ɖɵʊɒɼɖ 江戸 21 PM00000050000001431 2013, 17:36:14
0

Обратите внимание, что вы, возможно, захотите выполнить нулевые проверки на них также до выполнения ваших .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);
}
ответил VeenarM 9 AMpTue, 09 Apr 2013 07:57:33 +040057Tuesday 2013, 07:57:33
0
ответил Morfildur 8 FebruaryEurope/MoscowbMon, 08 Feb 2010 11:53:05 +0300000000amMon, 08 Feb 2010 11:53:05 +030010 2010, 11:53:05
0

Можно использовать equalsIgnoreCase

ответил codaddict 8 FebruaryEurope/MoscowbMon, 08 Feb 2010 11:53:43 +0300000000amMon, 08 Feb 2010 11:53:43 +030010 2010, 11:53:43
0

Подробнее о строке см. в String Class и Учебники по строкам

ответил Gopi 8 FebruaryEurope/MoscowbMon, 08 Feb 2010 11:57:05 +0300000000amMon, 08 Feb 2010 11:57:05 +030010 2010, 11:57:05
0

Чтобы быть нулевым, вы можете использовать

org.apache.commons.lang.StringUtils.equalsIgnoreCase(String, String)

или

org.apache.commons.lang3.StringUtils.equalsIgnoreCase(CharSequence, CharSequence)
ответил brandstaetter 12 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 12 Sep 2017 15:34:39 +0300 2017, 15:34:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132