続・とってもわかりやすいJAVA 【サンプルプログラム7 回文判定プログラムを作ろう!】
今回は回文判定を行う作っていみたいと思います。
まず回文とは、「前から読んでも後ろから読んでも同じになる文」のことを言います。
「しんぶんし」、「とまと」、「たけやぶやけた」みたいな文のことです。
英語だと「palindrome」というみたいです。
方法としては思いつく限り2通り。
- 最初の文字と最後の文字を順番に比較する
- 元の文章と逆順にした文章を比較する
この2つを作ってみたいと思います。
では1つ目から。
■Palindrome_01.java
class Palindrome_01 { public static void main(String[] args) { String sentence = "しんぶんし"; System.out.print(sentence + "は"); if(isPalindrome(sentence)) { System.out.println("【回文です】"); } else { System.out.println("【回文ではありません】"); } } public static boolean isPalindrome(String sentence) { int minIdx = 0; int maxIdx = sentence.length() - 1; while(minIdx < maxIdx) { if(sentence.charAt(minIdx++) != sentence.charAt(maxIdx--)) { return false; } } return true; } }
■解説
3行目の文字列を回文か判定しています。
そして判定処理はメソッドで行っています。
isPalindromeメソッドに判定したい文をStringとして渡し、回文であればtrue、回文でなければfalseをreturnするような処理を書いています。
先頭の文字を取るインデックスは0、最後の文字を取るインデックスは(文字数 – 1)になります。
比較したあとはインクリメントあるいはデクリメントして比較する文字列を移動させていきます。
しんぶんし
01234
「0と4」、「1と3」と順番に比較していくわけですね。
では2つ目。
2つ目は間違いやすい点があります。
ではまず間違いの例から
■Palindrome_02.java(間違いの例)
public class Palindrome_02 { public static void main(String[] args) { String sentence = "しんぶんし"; System.out.print(sentence + "は"); if(isPalindrome(sentence)) { System.out.println("【回文です】"); } else { System.out.println("【回文ではありません】"); } } public static boolean isPalindrome(String sentence) { StringBuilder sb = new StringBuilder(sentence); return sentence.equals(sb.reverse()); } }
■解説
文字列を逆にするためにはStringBuilderクラスのreverceメソッドを使うと簡単です。
しかし、この記述では回文ではないと判定されてしまいます。
原因はString型とStringBuilder型をequalsメソッドで比較していることにあります。
この場合「文字列の比較」ではなく、「参照先の比較」になってしまいます。
そのためfalseがretrunされてしまうので回文ではないと判定されてしまいます。
※ちなみにStringBuilderクラスのequalsメソッドは文字列ではなく参照先の比較の比較になります。
では正しいものに直しましょう!
■Palindrome_02.java
public class Sample { public static void main(String[] args) { String sentence = "しんぶんし"; System.out.print(sentence + "は"); if(isPalindrome(sentence)) { System.out.println("【回文です】"); } else { System.out.println("【回文ではありません】"); } } public static boolean isPalindrome(String sentence) { StringBuilder sb = new StringBuilder(sentence); return sentence.equals(sb.reverse().toString()); } }
■解説
String型とStringBuilder型で文字列の比較ができないなら、StringBuilderをStringにしてしまえ!
ということでStringBuilderのオブジェクトからtoStringメソッドを呼び出しました(14行目)
これで文字列同士の比較になるので正しく判定を行うことができます!