首页 > 解决方案 > 我希望将用户给定字符串的所有小写字母转换为“#”。但是在运行代码时,只有最后一个小写字符被转换

问题描述

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

标签: javastringreplacelowercase

解决方案


这里:

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(). 它只是替换要查找的字符的第一次出现。换句话说:如果你的词是“Aaba”,你总是只用#替换第一个'a'。

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

有多种方法可以解决这个问题,例如使用replaceAll(). 该方法允许使用正则表达式,因此您可以说(一次调用)“用# 替换所有小写字符”。

另一种方法是:

  • 创建一个 StringBuilder 某人
  • 迭代你的 s1 字符串
  • 如果 char 是小写字母:将 # 附加到 sb
  • 否则附加字符
  • 最后,把 sb 变成一个真正的字符串

推荐阅读