Я хочу преобразовать все строчные буквы заданной пользователем строки в '#'. Но после запуска кода конвертируется только последний строчный символ - PullRequest
1 голос
/ 21 марта 2019

Я хочу преобразовать все строчные буквы заданной пользователем строки в '#'. Но после запуска кода конвертируется только последний строчный символ. Может ли кто-нибудь предложить решение этой проблемы? (Я новичок в Java)

import java.util.Scanner;

class replaceEx{
    public static void main(String args[])
    {
        Scanner s=new Scanner(System.in);
        String s1,s2=null;
        s1=s.nextLine();
        for(int i=0;i<s1.length();i++)
        {
            if(s1.charAt(i)>='a' && s1.charAt(i)<='z')
            s2=s1.replace(s1.charAt(i),'#');
        }
        System.out.println(s2);
    }
}

Ввод : ABCDabcd

Вывод : ABCDabc #

Ответы [ 3 ]

5 голосов
/ 21 марта 2019

Здесь:

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 в настоящую строку
0 голосов
/ 21 марта 2019
import java.util.Scanner;
//class name should be start with capital letter in java
class ReplaceEx{
    public static void main(String args[])
    {
     Scanner s=new Scanner(System.in);
     String s1,s2=null;
     s1=s.nextLine();
     //Changed below line from s2=s1.replace(s1.charAt(i),'#') to
     s2=s1.replaceAll("[a-z]", "#");
     System.out.println(s2);
   }
}
0 голосов
/ 21 марта 2019

@ GhostCat - отличный ответ, и я хочу показать пример, который он указал, используя функцию потоков Java.Взгляните на это:

    String simpleText = "What is a weather like? Day is beitufil.";
    // int 32 is equal to empty space character ' '
    String processedText  = simpleText.chars().mapToObj(i -> i != 32 ? '#' : (char)i).collect(StringBuilder::new, (text, character) -> text.append((char)character), StringBuilder::append).toString();
    System.out.println(processedText);
...