2016-10-24 8 views
0

私はこの方法は文字列全体の先頭に文字を挿入している、各部分の先頭に文字を挿入しようとする代わりの部分文字列の位置0に挿入しています。例:のStringBuilder insertメソッド

Input: esttar apple%hc orange%hc annanabar eachpar 
Expected output: test apple orange banana peach 
Actual output: pbtest apple orange anana each 

すべては、StringBuilderの挿入メソッドのほかに意図どおりに機能します。私のコードは以下の通りです。事前に多くの時間を感謝します。

private String decryptText(String encrypted, String cipher){ 
    StringBuilder stringBuilder = new StringBuilder(); //for manipulating the substrings 
    StringBuilder builder2 = new StringBuilder(); //StringBuilder object for returning and accumulating instances of decrypted 
    String decryptedSS = ""; 

    cipher = cipher.replaceAll("-", ""); //replaces all the hyphens 
    char[] cipherKey = cipher.toCharArray(); //converts the cipherKey to a character array 
    char y1 = cipherKey[2]; 


    String[] strArr = encrypted.split(" "); //splits the string into an array 

    for(String subStr : strArr){ //for each substring in the string array 

     stringBuilder.append(subStr); //copies the substring into a String Builder object 

     stringBuilder = stringBuilder.deleteCharAt(stringBuilder.length()-1); //deletes the last character 
     stringBuilder = stringBuilder.deleteCharAt(stringBuilder.length()-1); //deletes the last character 

     char first = stringBuilder.charAt(stringBuilder.length()-1); //copies the last character for prepending to the word if the word started with a consonant 


     if(stringBuilder.charAt(stringBuilder.length()-1) == y1){ //if the last character is equal to y1 
      stringBuilder.deleteCharAt(stringBuilder.length()-1); //delete it 

     } 
     else{ //******The problem resides in this else statement 
      stringBuilder.deleteCharAt(stringBuilder.length()-1); //delete the last character 
      stringBuilder.insert(0, first); //insert the copied character at the beginning of the substring 
     } 

     stringBuilder.append(" "); //appends a space to each word 
     decryptedSS = stringBuilder.toString(); //converts the StringBuilder object to a string 
    } 

    builder2.append(decryptedSS); //appends the decrypted substring to the StringBuilder object to concatenate the string 

    String decrypted = builder2.toString(); //converts the StringBuilder object to a string 

    return decrypted; //returns the decrypted string 
} 
+0

まだ追加していない場合は、デバッガを使用してコードを実行してください。Eclipseにはまともな機能があります。それが起こったとしてエラーをキャッチするのに役立ちます。 – Matt1776

答えて

1

この行は問題です:

stringBuilder.insert(0, first); //insert the copied character at the beginning of the substring 

stringBuilderここでは、現在のサブストリングが、代わりにあなたが構築しようとしている最終的に復号化された文字列を表すものではありません。そのため、値は文字列全体の先頭に追加されています。

あなたは、いくつかのオプションがあります。

  1. あなたはその後、stringBuilderをクリアし、builder2にループの最後でstringBuilderから結果の文字列を追加することができます。あなたのコードが書かれた方法から、私は、これはあなたが期待していたものです想像:あなたはまた、あなたがループの外に持ってbuilder2.append(decryptedSS);を削除します

    builder2.append(decryptedSS); 
    stringBuilder.setLength(0); 
    

    注意を。

  2. あなたは、ループの開始時にstringBuilderの長さを保存し、あなたは完全にあなたのループでsubStrを変更することができる代わりに、0

  3. のその値に挿入し、でstringBuilderに完成版を追加することができループの終わり。

+0

ありがとう!これは非常に洞察力があった。とても有難い。 –

0

java.lang.StringBuilder.insert(オフセット、文字cをINT)方法は、この配列にchar引数の文字列表現を挿入します。

第2引数は、このシーケンスの内容のoffsetの位置に挿入されます。このシーケンスの長さは1だけ増加します。オフセット引数は0以上で、このシーケンスの長さ以下でなければなりません。

宣言

public StringBuilder insert(int offset, char c) 

パラメータ

  • オフセット - これがオフセットされます。
  • c - これはchar値です。

戻り値

このメソッドは、このオブジェクトへの参照を返します。