用字符串Java替换元音计数器

时间:2016-01-05 02:01:05

标签: java string counter

我想知道如何修复我的元音计数器程序,我搜索了很多论坛,但没有运气。该实验室的描述是“将字符串中的所有元音都更改为数字。确保数字的范围为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的有损转换) 这是我的第一个编程课程,所以我真的对如何解决这个问题毫无头绪。

4 个答案:

答案 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