Здесь:
s2=s1.replace(s1.charAt(i),'#');
Что происходит: s2 становится s1 , где этот символ в i заменяется на '#'.
Вы предполагаете, что каким-то образом s2 запоминает предыдущие назначения. Это не так.
Другими словами: ваш код вызывает:
s2=s1.replace('a','#');
s2=s1.replace('b','#');
s2=s1.replace('c','#');
s2=s1.replace('d','#');
Итак, s2 становится назначенным ABCD # bcd, ABCDa # cd, ABCDab # d, ABCDabc #. И как сказано: только это последнее задание прилипает. Хуже того: replace()
не волнует тот индекс i
, который вы использовали для charAt()
. Он просто заменяет первое вхождение символа для поиска. Другими словами: если ваше слово «Ааба», вы всегда продолжаете заменять только это first 'a' на #.
Другими словами: весь ваш подход не может работать по нескольким причинам.
Есть несколько способов решить эту проблему, например, использовать replaceAll()
. Этот метод также позволяет использовать регулярные выражения, так что вы можете сказать (за один вызов) "легко заменить все строчные буквы на #".
Другой подход будет:
- создать StringBuilder sb
- итерация вашей строки s1
- если символ строчная буква: добавьте # к sb
- иначе добавить символ
- в конце превратить sb в настоящую строку