2016-10-24 8 views
0

Я пытаюсь вставить символ в начало каждой подстроки Вместо того, чтобы вставлять в позицию 0 подстроки, метод вставляет символ (символы) в начало всей строки. Например:Метод вставки StringBuilder

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); 
    stringBuilder.setLength(0); 
    

    Обратите внимание, что вы также удалить builder2.append(decryptedSS); что у вас есть вне цикла.

  2. Вы можете сохранить длину stringBuilder в начале цикла, и вставить в это значение вместо 0.

  3. Вы можете полностью изменить subStr в цикле, и добавить готовую версию для stringBuilder в конец цикла.

+0

Огромное вам спасибо! Это было очень проницательно. Очень признателен. –

0

The java.lang.StringBuilder.insert (INT смещение, символ с) метод вставляет строковое представление полукокса аргумента в эту последовательность.

Второй аргумент вставляется в содержимое этой последовательности в положение, обозначенное смещением. Длина этой последовательности увеличивается на единицу. Аргумент offset должен быть больше или равен 0 и меньше или равен длине этой последовательности.

Декларация

public StringBuilder insert(int offset, char c) 

Параметры

  • смещение - это смещение.
  • c - Это значение символа.

Возвращаемое значение

Этот метод возвращает ссылку на этот объект.