用整数替换String中的字符

时间:2017-07-09 07:30:26

标签: java string

    String str="b5l*a+i";//trying to replace the characters by user input (integer)
    StringBuffer sb=new StringBuffer(str);
    for(int i=0;i<sb.length();i++)
    {
        for(int j='a';j<='z';j++)
        {
            if(sb.charAt(i)==j)
            {
                System.out.println("Enter value for "+j);
                int ip=sc.nextInt();
                char temp=(char)ip;
                //here how to replace the characters by int????

            }
        }
    }

/ *最后看起来像输入值b 4输入值a 5输入值i 6输出为451 * 5 + 6 * /

3 个答案:

答案 0 :(得分:1)

使用正则表达式

你应该使用正则表达式,它更优雅,更强大。例如,在不更改代码行的情况下,可以使用包含多个字母的变量名称。

实施例

Scanner sc = new Scanner(System.in);
String str = "b5l*a+i";

// This pattern could be declared as a constant
// It matches any sequence of alpha characters
Pattern pattern = Pattern.compile("[a-zA-Z]+");

Matcher matcher = pattern.matcher(str);

StringBuffer result = new StringBuffer();

// For each match ...
while(matcher.find()) {
    // matcher.group() returns the macth found
    System.out.println("Enter value for "+ matcher.group());

    Integer input = sc.nextInt();

    // ... append the parsed string with replacement of the match ...
    matcher.appendReplacement(result, input.toString());
}

// ... and don't forget to append tail to add characters that follow the last match 
matcher.appendTail(result);

System.out.println(result);

答案 1 :(得分:0)

通过跟进凯文安德森的评论来获取你的代码并进行调整,这似乎可以满足您的需求:

Scanner sc = new Scanner(System.in);
String str="b5l*a+i";
StringBuffer sb=new StringBuffer(str);
for(int i=0;i<sb.length();i++)
{
    for(int j='a';j<='z';j++)
    {
        if(sb.charAt(i)==j)
        {
            System.out.println("Enter value for "+(char)j);
            int ip=sc.nextInt();
            sb.deleteCharAt(i);
            sb.insert(i, ip);
        }
    }
}

我可能会建议这个行为类似的代码吗?

Scanner sc = new Scanner(System.in);
String str="b5l*a+i";
StringBuffer sb=new StringBuffer(str);
for(int i=0;i<sb.length();i++)
{
    char original = sb.charAt(i);
    if(original >= 'a' && original <= 'z')
    {
        System.out.println("Enter value for "+original);
        int ip=sc.nextInt();
        sb.deleteCharAt(i);
        sb.insert(i, ip);
    }
}

它应该更有效率,因为它不必遍历字符。

修改

在看到@ Sebastien的优秀答案并应用我自己的更多更改之后,我相信以下是比上述解决方案更好的解决方案,如果它符合您项目的限制。

Scanner sc = new Scanner(System.in);
String str = "b5l*a+i";
Matcher matcher = Pattern.compile("[a-z]").matcher(str);
StringBuilder sb = new StringBuilder(str);
while (matcher.find())
{
    System.out.println("Enter value for " + matcher.group());
    int ip = sc.nextInt();
    sb.setCharAt(matcher.start(), Character.forDigit(ip, 10));
}

以下是更好的选择:

  • 与正则表达式匹配的模式。这样您就不需要手动搜索String的每个字符并检查它是否是一个字母,然后决定如何处理它。您可以让Matcher为您执行此操作。正则表达式[a-z]表示“在a到z的范围内只有一个字符。matcher.find()方法每次在该表达式中移动true时返回String {1}}和false当没有更多。然后,matcher.group()获取过去find()操作中的字符(作为String,但不是matcher.start()对我们来说很重要。)start()获取匹配的索引(方法名为end()start(),因为典型的匹配将是多个字符并具有开始和结束索引,但只有StringBuilder对我们很重要。
  • 切换到StringBuilderStringBuffer被认为是StringBuilder旨在实现的最新实现。通常首选使用setCharAt,除非您需要您的应用程序是线程安全的(您不需要,除非您确定您确实需要它)。在我们的例子中,它还通过提供char方法使操作变得更加容易,这正是我们需要做的。现在我们可以在我们打算改变的Matcher的索引(我Character如此方便地提供给我们)中,以及我们从输入中获得的新角色。我们必须首先使用forDigit10类的方便静态方法从int中创建一个字符。第一部分是我们从输入读取的数字,第二部分是基数,它需要知道以确定数字的有效性(例如,在基数10中,输入'a'将无效,但在base-16,十六进制中,它将返回10),在我们的例子中我们输入10,因为base-10是最常用的英文数字系统。如果输入无效(即多个基数为10的数字,如forDigit或小于0),它将返回一个空字符,因此您可能希望将其从char ipChar = Character.forDigit(ip, 10); if (ipChar == '\u0000') throw new MyCustomNotADigitException("error message"); sb.setCharAt(matcher.start(), ipChar); 中弹出参数并首先检查它是否为null,并相应地处理输入,如下所示:

    $('#currency').inputmask({ 'alias': 'decimal', 'groupSeparator': ',', 'autoGroup': true, 'digits': 2, 'digitsOptional': false, 'placeholder': '0.00'});
    

答案 2 :(得分:0)

String str = "muthu", str1 = "";
        int n = 5;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == 'u') {
                str1 = str1 + n;
            } else
                str1 = str1 + str.charAt(i);
        }