web-dev-qa-db-ja.com

文字列比較で大文字と小文字を区別しないようにするにはどうすればよいですか?

2つの文字列を比較するJavaプログラムを作成しました。

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

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

「ようこそ」と表示されます。大文字と小文字が区別されることを理解しています。しかし、私の問題は、大文字と小文字を区別せずに2つの文字列を比較することです。つまり出力はhaiになるはずです。

107
user268018
  • 最適なのはs1.equalsIgnoreCase(s2)を使用することです( javadoc を参照)
  • また、両方を大文字/小文字に変換し、s1.equals(s2)を使用することもできます
163
Michael Bavin

String.equalsIgnoreCase()を使用します

Java AP​​Iリファレンスを使用して、これらのような答えを見つけてください。

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/

40
Thirler

String.equalsIgnoreCase は、大文字と小文字を区別しない単純な文字列比較に最も実用的な選択肢です。

ただし、このメソッドは大文字と小文字の完全な折りたたみも分解も行わないため、Unicode標準で指定されている大文字と小文字の一致を実行できないことに注意してください実際、JDK APIは大文字と小文字を区別する文字データに関する情報へのアクセスを提供しないため、このジョブは、実証済みでテスト済みのサードパーティライブラリに委任するのが最適です。

そのライブラリは 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
glts

compareToIgnoreCaseオブジェクトのStringメソッドを使用する必要があります。

int compareValue = str1.compareToIgnoreCase(str2);

if (compareValue == 0)は、str1str2と等しいことを意味します。

22
Aliti
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

10
KNU

デフォルトのJava AP​​Iには次のものがあります。

String.CASE_INSENSITIVE_ORDER

したがって、並べ替えられたデータ構造で文字列を使用する場合、コンパレータを書き換える必要はありません。

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

独自のコードでの純粋な等価性チェックに必要なものです。

Javaでの文字列の同等性に関係する情報についての詳細情報のみ。 Java.lang.StringクラスのhashCode()関数は「大文字と小文字を区別します」:

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」などのキーを同等と見なしたい場合は、文字列を別のクラスでラップする必要があります(拡張できません)最終クラスなので文字列)。例えば ​​:

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チェックを実行することもできます。

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);
}
2
VeenarM
1
Morfildur

equalsIgnoreCase を使用できます

1
codaddict

文字列についての詳細は String Class および String Tutorials にあります。

1
Gopi

Nullsafeにするには、次を使用できます。

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

または

org.Apache.commons.lang3.StringUtils.equalsIgnoreCase(CharSequence, CharSequence)
0
brandstaetter