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 * /
答案 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
对我们很重要。切换到StringBuilder
。 StringBuffer
被认为是StringBuilder
旨在实现的最新实现。通常首选使用setCharAt
,除非您需要您的应用程序是线程安全的(您不需要,除非您确定您确实需要它)。在我们的例子中,它还通过提供char
方法使操作变得更加容易,这正是我们需要做的。现在我们可以在我们打算改变的Matcher
的索引(我Character
如此方便地提供给我们)中,以及我们从输入中获得的新角色。我们必须首先使用forDigit
类10
类的方便静态方法从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);
}