文字列が一致するか比較する方法/大文字・小文字を区別せずに比較する方法

Scala 3 (Dotty 0.26.0-RC1) 2.13.3 2.12.12
最終更新:2020年7月31日

[AD] scalapediaでは記事作成ボランティアを募集しています

この記事では、文字列が一致するかどうかを比較する方法について解説します。

どちらの文字列が辞書的に先か後かを比較する方法については、こちらの記事をご覧ください。

文字列を単純に比較するには == を使用する

まず、文字列を単純に比較するだけであれば、Scalaでは==演算子を使用すればOKです。

val title = "Scala逆引き解説 Scalapedia" val target = "scala逆引き解説 SCALAPEDIA"
println(target == title)

出力は以下のようになります。

false

大文字・小文字の違いがあるので、比較した結果もfalseとなります。

equalsIgnoreCaseメソッドで大文字・小文字を区別せずに比較する

文字列を大文字・小文字区別せずに比較するには、equalsIgnoreCaseメソッドを使用しましょう。

Java
public int equalsIgnoreCase(String str)

equalsIgnoreCase メソッドは、2つの文字列の大文字・小文字の区別をなくした上で辞書的に比較するメソッドです。

一致する場合はtrue、一致しない場合はfalseを返します、

実際に equalsIgnoreCaseメソッドを使用してみましょう。

println(target.equalsIgnoreCase(title))

出力は以下のようになります。

true

大文字・小文字の違いを除けば一致しているので、結果はtrueとなりました。

文字列を部分的に比較するには regionMatches メソッドを使用する

regionMatches メソッドを使用すると、文字列を部分的に比較することができます。

compareToIgnoreCase メソッドのように、大文字・小文字を区別せずに比較することもできます。

文字列を辞書的に比較するには compareTo メソッドを使用する

compareTo メソッドを使用すると、文字列を辞書的にどちらが前か後ろなのかを比較することができます。

また、compareToIgnoreCase メソッドを使用すると、大文字・小文字を区別せずに比較することができます。

これらのメソッドについて、詳しくは以下の記事をご覧ください。

さらに正確に比較するには java.text.Collatorクラスを使用する

上述の各メソッドはロケールを考慮しません。
したがって、特に大文字・小文字を区別しない場合には、特定のロケールで予期せぬ結果が生じることがあります。

より正確な比較を行いたい場合には、Collatorクラスを使用してください。

Java 11 API Docs:java.text.Collator

Javaにおける文字列比較には注意が必要

Javaで文字列を単純に比較するには equals を使用する

Javaにおいて文字列を比較する場合には、注意が必要です。

文字列を比較する場合にはcompareToメソッドか、equalsメソッドを使用しましょう。

Java
public boolean equals(Object anObject)
val title = "Scala逆引き解説 Scalapedia" val target = "scala逆引き解説 SCALAPEDIA"
java
System.out.println(title.equals(target));
false

Javaでは文字列の内容の比較のために==を使ってはいけない

文字列の内容を比較するために==を使ってはいけません。 予期せぬ結果が生じます。 以下の例を見てみましょう。

java
System.out.println(title == "Scala逆引き解説 Scalapedia");
true

trueが返ってきました。 一見正しく出力されているように見えますが、別の例もみてみましょう。

java
System.out.println(title == new String("Scala逆引き解説 Scalapedia"));
false

同じ文字列を比較しているはずなのに、結果が false となってしまいました。

これは、あくまで == がオブジェクトの参照を比較するメソッドであるためです。

第一の例では、両者が同じオブジェクトを参照するようにコンパイラが最適化してくれました。
そのため、あたかも期待通りの結果が返ってきているかのように見える、というわけです。

Javaにおいて文字列を比較する場合は equals メソッドを使用しましょう。

サイト内検索


カテゴリ「文字列処理」の記事

文字列をエスケープしたり復元したりする方法(Apache Commons Text) JavaとScalaのString/StringBuilder/StringBuffer使い分け事情 文字列を分割する方法(split・splitAt・linesIterator・linesWithSeparatorsメソッド) trimメソッドで文字列の前後の空白を除去する 文字列が一致するか比較する方法/大文字・小文字を区別せずに比較する方法 特定の文字の文字コード(コード・ポイント)を取得する replaceメソッドなど、文字列を置換する方法を紹介 文字列の先頭や末尾を、取得したり切り落としたりする方法 containsメソッドでStringに特定の文字列が含まれるか調べる方法 数値を文字列に変換する方法 stripメソッドで文字列の前後の全角空白を除去する 文字列を数値に変換するには?to○○メソッドと注意点について 文字列を辞書的に比較する方法/大文字・小文字を区別せずに比較する方法 文字列が特定の文字列で始まるか・終わるかを調べる方法 【getBytes&size】文字列のバイト長を取得する方法 substringでStringを切り取り、部分文字列を抽出する方法 StringOpsとWrappedStringの違いは? 文字列を連結するには?+演算子やString interpolationの使い方 文字列の大文字へ・小文字へ変換する方法 文字列を逆順にする方法 文字列の文字コード(文字セット)を変換する方法 文字列の長さを取得する方法:lengthとcodePointCountの使い分け 文字列をURLエンコード・デコードする方法 文字列が正規表現に合致するか調べる方法 この文字の位置はどこ?文字列のインデックスを取得する方法 文字列をバイト列に、またはバイト列を文字列に変換する方法

カテゴリ「文字列処理」の記事

文字列をエスケープしたり復元したりする方法(Apache Commons Text) JavaとScalaのString/StringBuilder/StringBuffer使い分け事情 文字列を分割する方法(split・splitAt・linesIterator・linesWithSeparatorsメソッド) trimメソッドで文字列の前後の空白を除去する 文字列が一致するか比較する方法/大文字・小文字を区別せずに比較する方法 特定の文字の文字コード(コード・ポイント)を取得する replaceメソッドなど、文字列を置換する方法を紹介 文字列の先頭や末尾を、取得したり切り落としたりする方法 containsメソッドでStringに特定の文字列が含まれるか調べる方法 数値を文字列に変換する方法 stripメソッドで文字列の前後の全角空白を除去する 文字列を数値に変換するには?to○○メソッドと注意点について 文字列を辞書的に比較する方法/大文字・小文字を区別せずに比較する方法 文字列が特定の文字列で始まるか・終わるかを調べる方法 【getBytes&size】文字列のバイト長を取得する方法 substringでStringを切り取り、部分文字列を抽出する方法 StringOpsとWrappedStringの違いは? 文字列を連結するには?+演算子やString interpolationの使い方 文字列の大文字へ・小文字へ変換する方法 文字列を逆順にする方法 文字列の文字コード(文字セット)を変換する方法 文字列の長さを取得する方法:lengthとcodePointCountの使い分け 文字列をURLエンコード・デコードする方法 文字列が正規表現に合致するか調べる方法 この文字の位置はどこ?文字列のインデックスを取得する方法 文字列をバイト列に、またはバイト列を文字列に変換する方法