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

问题描述 投票:1回答:3

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

java string replace lowercase
3个回答
5
投票

这里:

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()。该方法还允许使用正则表达式,因此您可以轻松地说(在一个调用中)“用#替换所有小写字符”。

另一种方法是:

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

0
投票

@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);

0
投票
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);
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.