字符串中的元音计数器已替换 Java

Vowel Counter Replaced in String Java

我想知道如何修复我的元音计数器程序,我搜索了很多论坛但都没有成功。实验室的描述是 "change all of the vowels in the String to numbers. Make sure the numbers range from 0-9 and that you reset the number to 0 when you get to a count > 9." 所以示例输入将是 "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;
    }
}

亚军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 的可能有损转换) 这是我的第一个编程 class,所以老实说我不知道​​如何解决这个问题。

JavaString is immutable, and you aren't assigning the result of replace (but I would prefer a StringBuilder, because it is mutable). Next, using a switch is, again in my opinion, easier to read here. As is a 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();
}

您正在用 int 值调用替换 - java 不会自动将此 int 转换为字符。您需要将 int 显式转换为人类可读的字符。这是一个快速而肮脏的修复:

将所有 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 将用相同的东西替换该字符串中字母的所有实例,我认为你不想要

编译错误为您提供了线索(请参阅有关 replace 方法的 javadocs)。您正在尝试使用整数来替换字符,您需要做的是将元音替换为数字的字符值,例如“1”或“2”等。

此外,对字符串调用替换将 return 字符串的新副本,因此即使您调用替换,也不会获得预期的效果。在这里想想有点不同(数组、StringBuffers 等)

给你,

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") );
    }
}

将给出 out-put

0bcd1f
hhhhhhh
0123456
c0tp1gd2tr3th4gb5gfr6gm78s9g01s2
hhhhhhh1234356HHHHDH
0123456789878780lkjd1slwl2jrl3jfl4wjkflwj

x
0

也请看看我的实验:http://rextester.com/CEIUP1959