2つの文字列を比較するJavaプログラムを作成しました。
String s1 = "Hello";
String s2 = "hello";
if (s1.equals(s2)) {
System.out.println("hai");
} else {
System.out.println("welcome");
}
「ようこそ」と表示されます。大文字と小文字が区別されることを理解しています。しかし、私の問題は、大文字と小文字を区別せずに2つの文字列を比較することです。つまり出力はhai
になるはずです。
s1.equalsIgnoreCase(s2)
を使用することです( javadoc を参照)s1.equals(s2)
を使用することもできますString.equalsIgnoreCase()
を使用します
Java APIリファレンスを使用して、これらのような答えを見つけてください。
http://Java.Sun.com/j2se/1.5.0/docs/api/Java/lang/String.html#equalsIgnoreCase(Java.lang.String)
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
を含むもう少しの作業が必要になる場合があります。)
compareToIgnoreCase
オブジェクトのString
メソッドを使用する必要があります。
int compareValue = str1.compareToIgnoreCase(str2);
if (compareValue == 0)
は、str1
がstr2
と等しいことを意味します。
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
デフォルトのJava APIには次のものがあります。
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);
}
s1.equalsIgnoreCase(s2)を使用します
http://Java.Sun.com/j2se/1.4.2/docs/api/Java/lang/String.html#equalsIgnoreCase(Java.lang.Object)
equalsIgnoreCase を使用できます
文字列についての詳細は String Class および String Tutorials にあります。
Nullsafeにするには、次を使用できます。
org.Apache.commons.lang.StringUtils.equalsIgnoreCase(String, String)
または
org.Apache.commons.lang3.StringUtils.equalsIgnoreCase(CharSequence, CharSequence)