我希望将给定字符串的用户的所有小写字母都转换为“#”。但是在运行代码时,仅最后一个小写字符被转换

Deb*_*day 1 java string replace lowercase

我希望将给定字符串的用户的所有小写字母都转换为“#”。但是在运行代码时,只有最后一个小写字符被转换。有人可以提出解决方案吗?(我是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输入:ABCDabcd

输出:ABCDabc#

Gho*_*ica 5

这里:

s2=s1.replace(s1.charAt(i),'#');
Run Code Online (Sandbox Code Playgroud)

发生的是:s2变成s1,其中我的char被替换为'#'。

您假设s2以某种方式记住了先前的分配。没有。

换句话说:您的代码确实调用了:

s2=s1.replace('a','#');
s2=s1.replace('b','#');
s2=s1.replace('c','#');
s2=s1.replace('d','#');
Run Code Online (Sandbox Code Playgroud)

因此,s2被分配了ABCD#bcd,ABCDa#cd,ABCDab#d,ABCDabc#。就像说的那样:只有最后一项任务能够完成。更糟:replace()不关心i您用于的索引charAt()。它仅替换要查找的首次出现的char。换句话说:如果您的单词是“ Aaba”,则始终始终仅用#替换第一个 “ a”。

换句话说:出于多种原因,您的整个方法行不通。

有多种解决方法,例如使用replaceAll()。该方法允许使用正则表达式,这样您就可以轻松地说出(一次调用)“用#替换所有小写字符”。

另一种方法是:

  • 创建一个StringBuilder sb
  • 迭代您的s1字符串
  • 如果一个字符是小写字母:将#附加到sb
  • 否则追加字符
  • 最后,将sb转换为真实字符串