2016-09-14 17 views
-2

回文文字列が「バウンドのうち、文字列のインデックス-1」このエラーを取得回文文字列例外「メイン」java.lang.StringIndexOutOfBoundsException:範囲外の文字列インデックス:-1

public static void main(String[]args) { 

    String s= "Madam"; 
    String Temp=s; 
    String k=new String(); 
    //System.out.println(s.length()); 
    int m=s.length(); 

    for (int i=5;i>=m;m--) { 
     System.out.println(m); 
     String t=String.valueOf(s.charAt(m-1)) ; 
     k=k+t; 
     System.out.println(k); 
    } 

    System.out.println(k); 

    if (k==Temp) { 
     System.out.println("String is Palindrome"+" "+k); 
    } else { 
     System.out.println("String is not Palindrome"); 
    } 
} 
+3

のうち '等号()' –

答えて

0

非常に大きい場合、これはあまりにも効率的ではないでしょう代わりにm--

または1つのデクリメント演算子でi--があるはずですiを使用したいが、mを扱う。 mも減少しています。 mが0に減少するたびに、s.charAt(m-1)は文字列の負の位置にある文字を検索しようとしています。その結果、StringIndexOutOfBoundsExceptionが得られます。だから、代わりに

for (int i=5;i>=m;m--) { 
    System.out.println(m); 
    String t=String.valueOf(s.charAt(m-1)) ; 
    k=k+t; 
    System.out.println(k); 
} 

のそれは次のようになります。

for (int i = m-1; i >= 0; i--) { 
    String t = String.valueOf(s.charAt(i)) ; 
    k=k+t; 
    System.out.println(k); 
} 

単にコードは次のようになります。

String s = "Madam", reverse = ""; 
int m = s.length(); 

for (int i = m - 1; i >= 0; i--) { 
    reverse += s.charAt(i); 
} 
System.out.println(reverse); 

if (reverse.equalsIgnoreCase(s)) { // don't use '==' for checking equality of strings 
    System.out.println(s + " is Palindrome"); 
} else { 
    System.out.println(s + " is not Palindrome"); 
} 
+0

ありがとう "For Loop"は完璧に機能しました。私はコードを改善しただけでなく、コーディングのもう一つの良い方法を学んだ。助けてくれてありがとう –

1

チェックしようとしていますが削除本この

for (int i=s.length();i>0;i--) 
String t=String.valueOf(s.charAt(i-1)) ; 

for (int i=5;i>=m;m--) 

文字列の長さは、この場合には5であるためdの場合、この場合はインデックス範囲は0-4です。また、0のインデックスにアクセスしていますので、この場所に-1を与えます。s.charAt(m-1) 0のインデックスをトラバースしません。プラスラインコードも

System.out.println(s.equals(new StringBuilder(s).reverse().toString())); 
// this will give you boolean result with True or False 
// which can be used with conditional statements to make thing concise and clean 

とすることができますが、文字列を使用して、ループではかなり

+0

例外」文字列のインデックスとの平等をチェック(int i = m-1; i> = 0; i--) " –

+0

更新されたものを試してみましたが、タイプミスがありました:p –

+1

' StringBuilder'アプローチ間違いなくより多くのefになります'String.valueOf'を呼び出すよりも邪魔になり、各文字*の文字列連結*が続きます。 's.contentEquals(new StringBuilder(s).reverse())'を使ってさらに効率を上げることはできますが、残念ながらOPの例のように最初は大文字では機能しません。ところで、 'S.o.p'のような略語は使わないでください。あなたは、ターゲットオーディエンス(特に初心者)を混乱させることを犠牲にして、数秒間のタイピングを省く。 – Holger

関連する問題