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

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

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

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

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

вопрос задан 8.02.2010
user268018
509 репутация

12 ответов


  • 152 рейтинг
    • Лучше всего использовать s1.equalsIgnoreCase(s2): (см. javadoc )
    • Вы также можете преобразовать их в верхний / нижний регистр и использовать s1.equals(s2)
    ответ дан Michael Bavin, с репутацией 2529, 8.02.2010
  • 40 рейтинг

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

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

    http: // java. солнце. ком / j2se / 1. 5. 0 / документы / API / Java / языки / String. HTML # equalsIgnoreCase (Java. яз. Строка)

    http: // java. солнце. ком / j2se / 1. 5. 0 / docs / api /

    ответ дан Thirler, с репутацией 14521, 8.02.2010
  • 20 рейтинг

    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, с репутацией 14241, 23.01.2016
  • 18 рейтинг

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

    int compareValue = str1.compareToIgnoreCase(str2);
    

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

    ответ дан Aliti, с репутацией 1186, 1.05.2012
  • 9 рейтинг
    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, с репутацией 1356, 13.02.2014
  • 3 рейтинг

    В Java API по умолчанию у вас есть:

    String.CASE_INSENSITIVE_ORDER
    

    Таким образом, вам не нужно переписывать компаратор, если вы должны использовать строки с отсортированными структурами данных.

    String s = "some text here";
    s.equalsIgnoreCase("Some text here");
    

    Это то, что вы хотите для чистых проверок на равенство в вашем собственном коде.

    Просто для получения дополнительной информации обо всем, что касается равенства строк в Java. HashCode () функция Java. яз. Строковый класс "чувствителен к регистру":

    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 map = new HashMap();
    
    ответ дан ɭɘ ɖɵʊɒɼɖ 江戸, с репутацией 2286, 21.08.2013
  • 2 рейтинг

    Обратите внимание, что вы, возможно, захотите сделать нулевые проверки на них, прежде чем делать ваши. равно или. 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, с репутацией 1042, 9.04.2013
  • 1 рейтинг
    ответ дан Morfildur, с репутацией 9783, 8.02.2010
  • 1 рейтинг

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

    ответ дан codaddict, с репутацией 337564, 8.02.2010
  • 1 рейтинг

    Подробнее о строке можно найти в Строка класса и Учебники по строке

    ответ дан Gopi, с репутацией 2900, 8.02.2010
  • -1 рейтинг

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

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

    или

    org.apache.commons.lang3.StringUtils.equalsIgnoreCase(CharSequence, CharSequence)
    
    ответ дан brandstaetter, с репутацией 438, 12.09.2017
  • -6 рейтинг
    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
    ответ дан javacoder, с репутацией 1, 15.11.2013