我想知道如何修复我的元音计数器程序,我搜索了很多论坛,但没有运气。该实验室的描述是“将字符串中的所有元音都更改为数字。确保数字的范围为0-9,并且当您计数> 9时,将数字重置为0”。所以样本输入为“abcdef”,样本输出为“0bcd1f”。
我的主要代码是
public class VowelCounter
{
public static String getNumberString(String s)
{
int counter = 0;
for(int i = 0; i<s.length(); i++)
{char g = s.charAt(i);
if(g =='a')
{
counter++;
s.replace(g,counter);
}
else if(g =='e')
{
counter++;
s.replace(g,counter);
}
else if(g =='i')
{
counter++;
s.replace(g,counter);
}
else if(g =='o')
{
counter++;
s.replace(g,counter);
}
else if(g =='u')
{
counter++;
s.replace(g,counter);
}
else if(g =='A')
{
counter++;
s.replace(g,counter);
}
else if(g =='E')
{
counter++;
s.replace(g,counter);
}
else if(g =='I')
{
counter++;
s.replace(g,counter);
}
else if(g =='O')
{
counter++;
s.replace(g,counter);
}
else if(g =='U')
{
counter++;
s.replace(g,counter);
}
}
return s;
}
}
Runner Class是
public class VowelCounterRunner
{
public static void main ( String[] args )
{
System.out.println( VowelCounter.getNumberString("abcdef") );
System.out.println( VowelCounter.getNumberString("hhhhhhh") );
System.out.println( VowelCounter.getNumberString("aaaaaaa") );
System.out.println( VowelCounter.getNumberString("catpigdatrathogbogfrogmoosegeese") );
System.out.println( VowelCounter.getNumberString("hhhhhhh1234356HHHHDH") );
System.out.println( VowelCounter.getNumberString("AEIOUaeiou87878alkjdaslwlejrlajflawjkflwj") );
System.out.println( VowelCounter.getNumberString("") );
System.out.println( VowelCounter.getNumberString("x") );
System.out.println( VowelCounter.getNumberString("e") );
}
}
我遇到的错误是使用replace方法。它表示“没有找到适合替换的方法(char,int),方法java.lang.String.replace(char,char)不适用;(参数不匹配;可能从int转换为char的有损转换) 这是我的第一个编程课程,所以我真的对如何解决这个问题毫无头绪。
答案 0 :(得分:5)
Java String
immutable ,你没有分配replace
的结果(但我更喜欢StringBuilder
,因为它是可变)。接下来,在我看来,使用switch
在这里更容易阅读。和for-each
loop一样。把它们放在一起,它可能看起来像
public static String getNumberString(String s) {
if (s == null || s.isEmpty()) {
return "";
}
StringBuilder sb = new StringBuilder(s.length());
int counter = 0;
for (char ch : s.toCharArray()) {
switch (Character.toLowerCase(ch)) {
case 'a': case 'e': case 'i': case 'o': case 'u':
sb.append(counter);
counter++;
if (counter > 9) {
counter = 0;
}
break;
default:
sb.append(ch);
}
}
return sb.toString();
}
答案 1 :(得分:5)
您正在使用int值调用replace - java不会自动将此int转换为字符。您需要将int显式转换为人类可读的char。这是一个快速而肮脏的修复:
将所有s.replace
来电更改为
s = s.replace(g,(counter+"").charAt(0));
您会发现代码中还存在其他问题,即使修复了替换问题。应该有效的代码:
s = s.substring(0,i) + counter + s.substring(i);
这不需要显式转换int值的原因是因为连接运算符(+
)将它转换为文本。
要点:
在Java中,类型不仅仅是混合 - int != char
,你必须告诉编译器你希望如何转换它
s.replace
不会导致s
中的任何内容发生变化,您需要将s
设置为s.replace
的结果 - 有点难以理解当你刚开始的时候,你会在练习中得到它
s.replace
将使用相同的内容替换该字符串中所有字母的实例,我认为不需要
答案 2 :(得分:1)
编译错误给你一个线索(参考replace方法的javadocs)。您正在尝试使用整数来替换字符,您需要做的是将元素替换为数字的字符值,如“1”或“2”等。
同时调用字符串上的replace将返回字符串的新副本,因此即使您正在调用替换,也不会获得所需的效果。这里有点不同(数组,StringBuffers等)
答案 3 :(得分:0)
你走了,
import java.util.*;
import java.lang.*;
class Rextester
{
public static final int ASCII_0 = 48;
public static String getNumberString(String s)
{
int counter = 0;
for(int i = 0; i<s.length(); i++)
{
char g = Character.toLowerCase(s.charAt(i));
if(g =='a' || g =='e' || g =='i' || g =='o' || g =='u')
{
StringBuilder sb = new StringBuilder(s);
sb.setCharAt(i, (char) (counter + ASCII_0));
s = sb.toString();
counter = (counter + 1) % 10;
}
}
return s;
}
public static void main(String args[])
{
System.out.println( getNumberString("abcdef") );
System.out.println( getNumberString("hhhhhhh") );
System.out.println( getNumberString("aaaaaaa") );
System.out.println( getNumberString("catpigdatrathogbogfrogmoosegeese") );
System.out.println( getNumberString("hhhhhhh1234356HHHHDH") );
System.out.println( getNumberString("AEIOUaeiou87878alkjdaslwlejrlajflawjkflwj") );
System.out.println( getNumberString("") );
System.out.println( getNumberString("x") );
System.out.println( getNumberString("e") );
}
}
会给出一个输出
0bcd1f
hhhhhhh
0123456
c0tp1gd2tr3th4gb5gfr6gm78s9g01s2
hhhhhhh1234356HHHHDH
0123456789878780lkjd1slwl2jrl3jfl4wjkflwj
x
0
请同时查看我的实验:http://rextester.com/CEIUP1959