[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
この記事では、文字列が一致するかどうかを比較する方法について解説します。
どちらの文字列が辞書的に先か後かを比較する方法については、こちらの記事をご覧ください。
文字列を単純に比較するには ==
を使用する
まず、文字列を単純に比較するだけであれば、Scalaでは==
演算子を使用すればOKです。
val title = "Scala逆引き解説 Scalapedia" val target = "scala逆引き解説 SCALAPEDIA"
println(target == title)
出力は以下のようになります。
false
大文字・小文字の違いがあるので、比較した結果もfalse
となります。
equalsIgnoreCase
メソッドで大文字・小文字を区別せずに比較する
文字列を大文字・小文字区別せずに比較するには、equalsIgnoreCase
メソッドを使用しましょう。
Javapublic int equalsIgnoreCase(String str)
equalsIgnoreCase
メソッドは、2つの文字列の大文字・小文字の区別をなくした上で辞書的に比較するメソッドです。
一致する場合はtrue
、一致しない場合はfalse
を返します、
実際に equalsIgnoreCase
メソッドを使用してみましょう。
println(target.equalsIgnoreCase(title))
出力は以下のようになります。
true
大文字・小文字の違いを除けば一致しているので、結果はtrueとなりました。
java.lang.String#equalsIgnoreCase(java.lang.String)
文字列を部分的に比較するには regionMatches
メソッドを使用する
regionMatches
メソッドを使用すると、文字列を部分的に比較することができます。
compareToIgnoreCase
メソッドのように、大文字・小文字を区別せずに比較することもできます。
java.lang.String#regionMatches(int, java.lang.String, int, int)
文字列を辞書的に比較するには compareTo
メソッドを使用する
compareTo
メソッドを使用すると、文字列を辞書的にどちらが前か後ろなのかを比較することができます。
また、compareToIgnoreCase
メソッドを使用すると、大文字・小文字を区別せずに比較することができます。
これらのメソッドについて、詳しくは以下の記事をご覧ください。
さらに正確に比較するには java.text.Collator
クラスを使用する
上述の各メソッドはロケールを考慮しません。
したがって、特に大文字・小文字を区別しない場合には、特定のロケールで予期せぬ結果が生じることがあります。
より正確な比較を行いたい場合には、Collatorクラスを使用してください。
java.text.Collator
Javaにおける文字列比較には注意が必要
Javaで文字列を単純に比較するには equals
を使用する
Javaにおいて文字列を比較する場合には、注意が必要です。
文字列を比較する場合にはcompareTo
メソッドか、equals
メソッドを使用しましょう。
Javapublic boolean equals(Object anObject)
val title = "Scala逆引き解説 Scalapedia" val target = "scala逆引き解説 SCALAPEDIA"
javaSystem.out.println(title.equals(target));
false
java.lang.String#equals(java.lang.Object)
Javaでは文字列の内容の比較のために==
を使ってはいけない
文字列の内容を比較するために==
を使ってはいけません。
予期せぬ結果が生じます。
以下の例を見てみましょう。
javaSystem.out.println(title == "Scala逆引き解説 Scalapedia");
true
true
が返ってきました。
一見正しく出力されているように見えますが、別の例もみてみましょう。
javaSystem.out.println(title == new String("Scala逆引き解説 Scalapedia"));
false
同じ文字列を比較しているはずなのに、結果が false となってしまいました。
これは、あくまで ==
がオブジェクトの参照を比較するメソッドであるためです。
第一の例では、両者が同じオブジェクトを参照するようにコンパイラが最適化してくれました。
そのため、あたかも期待通りの結果が返ってきているかのように見える、というわけです。
Javaにおいて文字列を比較する場合は equals
メソッドを使用しましょう。