我希望将用户给定字符串的所有小写字母转换为“#”。但是在 运行 代码上,只有最后一个小写字符被转换
I wish to convert all the lowercase letters of a user given string to '#'.But upon running the code,only the last lowercase char is getting converted
我希望将用户给定字符串的所有小写字母转换为“#”。但是在 运行 代码中,只有最后一个小写字符被转换。有人可以建议解决这个问题吗? (我是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,其中 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()
不关心您用于 charAt()
的索引 i
。它只是替换要查找的字符的 first 出现。换句话说:如果你的单词是 "Aaba",你 always 只用 # 替换 first 'a'。
换句话说:由于多种原因,您的整个方法都行不通。
有多种方法可以解决这个问题,例如使用replaceAll()
。该方法 也 允许使用正则表达式,因此您可以(在一次调用中)轻松地说 "replace all lowercase chars with #"。
另一种方法是:
- 创建一个 StringBuilder sb
- 迭代你的 s1 字符串
- 如果字符是小写字母:将 # 附加到 sb
- 否则追加字符
- 最后把sb变成真正的字符串
@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);
}
}
我希望将用户给定字符串的所有小写字母转换为“#”。但是在 运行 代码中,只有最后一个小写字符被转换。有人可以建议解决这个问题吗? (我是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,其中 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()
不关心您用于 charAt()
的索引 i
。它只是替换要查找的字符的 first 出现。换句话说:如果你的单词是 "Aaba",你 always 只用 # 替换 first 'a'。
换句话说:由于多种原因,您的整个方法都行不通。
有多种方法可以解决这个问题,例如使用replaceAll()
。该方法 也 允许使用正则表达式,因此您可以(在一次调用中)轻松地说 "replace all lowercase chars with #"。
另一种方法是:
- 创建一个 StringBuilder sb
- 迭代你的 s1 字符串
- 如果字符是小写字母:将 # 附加到 sb
- 否则追加字符
- 最后把sb变成真正的字符串
@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);
}
}