我希望将给定字符串的用户的所有小写字母转换为“#”。但是在运行代码时,只会转换最后一个小写字符。有人可以建议解决这个问题吗? (我是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#
这里:
s2=s1.replace(s1.charAt(i),'#');
会发生什么:s2变为s1,其中我的char被'#'替换。
你假设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()
。它只是替换要查找的第一个char。换句话说:如果你的单词是“Aaba”,你总是一直用#替换第一个'a'。
换句话说:由于多种原因,您的整个方法无法运作。
有多种方法可以解决这个问题,例如使用replaceAll()
。该方法还允许使用正则表达式,因此您可以轻松地说(在一个调用中)“用#替换所有小写字符”。
另一种方法是:
@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);
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);
}
}