I'm attempting to insert a character to the beginning of each substring Instead of inserting at position 0 of the substring, the method is inserting the character(s) to the beginning of the entire string. For example:
Input: esttar apple%hc orange%hc annanabar eachpar
Expected output: test apple orange banana peach
Actual output: pbtest apple orange anana each
Everything works as intended besides the StringBuilder insert method. My code is below. Many thanks ahead of time.
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
}
This line is the problem:
stringBuilder.insert(0, first); //insert the copied character at the beginning of the substring
the stringBuilder
here does not represent the current substring, but instead the final decrypted string that you are trying to build. That is why the value is getting added to the beginning of the entire string.
You have several options:
You can add the resulting string from stringBuilder
at the end of the loop to builder2
, then clear the stringBuilder
. From how your code was written, I imagine this is what you were expecting:
builder2.append(decryptedSS);
stringBuilder.setLength(0);
Note that you would also remove the builder2.append(decryptedSS);
that you have outside the loop.
You could save the length of stringBuilder
at the start of the loop, and insert into that value instead of 0.
You can fully modify subStr
in your loop, and append the completed version to stringBuilder
at the end of the loop.