Прежде всего, ваш код слишком сложен.Абсолютно нет необходимости
str = str.substring(1);
startIndex--;
внутри цикла - вы фактически удерживаете startIndex
в 0 и обрезаете символы в начале строки.Вместо этого вам следует просто перебирать символы строки (и печатать str.substring(startIndex)
, если вы хотите увидеть, что осталось обработать).
Кроме того, здесь
if(sb.toString().indexOf(startChar) != -1){
sb.append(adjacentChar);
System.out.println("Appended String in if part-->"
+ sb.toString());
}
вы стремитесь предотвратитьдобавление одного и того же символа снова, если он повторяется более двух раз подряд - но код на самом деле не позволяет добавлять символ в конструктор ever , если он уже есть, то есть ввод типа «aba» дастневерный вывод "ab".
И на самом деле, есть и источник вашей ошибки. Условие неверное:
if(sb.toString().indexOf(startChar) != -1){
дает true
, когдаstartChar
найдено в строке, содержащейся sb
!Если вы измените !=
на ==
, вы получите свой 'd' на выходе (однако, вы также получите дополнительный 'b').
Исправленный алгоритм
ВашПодход всегда сравнивать фактический символ со следующим не удается, когда один и тот же символ повторяется более двух раз подряд.Лучше всего запомнить последний символ, добавленный в буфер, и пропустить, пока не найдете другой символ, отличный от него:
public static String stringClean(String str){
final StringBuilder sb = new StringBuilder();
char lastAppendedChar = '\u0000';
for(int index = 0; index < str.length(); index += 1){
char actualChar = str.charAt(index);
if (actualChar != lastAppendedChar){
sb.append(actualChar);
lastAppendedChar = actualChar;
}
}// end of for loop
return sb.toString();
}