【问题标题】:Vowel Counter Replaced in String Java在字符串 Java 中替换元音计数器
【发布时间】:2016-01-05 02:01:05
【问题描述】:

我想知道如何修复我的元音计数器程序,我搜索了很多论坛但没有任何运气。实验室的描述是“将字符串中的所有元音更改为数字。确保数字范围为 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 类是

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 的可能有损转换) 这是我的第一堂编程课,所以我真的不知道如何解决这个问题。

【问题讨论】:

    标签: java string counter


    【解决方案1】:

    您正在使用 int 值调用 replace - 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 将用相同的东西替换该字符串中的所有字母实例,我认为您不希望这样做

    【讨论】:

      【解决方案2】:

      Java String不可变的,并且您没有分配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();
      }
      

      【讨论】:

        【解决方案3】:

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

        同时在字符串上调用 replace 将返回字符串的新副本,因此即使您调用 replace 也不会获得所需的效果。在这里想想有点不同(数组、StringBuffers 等)

        【讨论】:

          【解决方案4】:

          给你,

          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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-02
            • 1970-01-01
            • 1970-01-01
            • 2018-12-17
            • 2016-07-12
            相关资源
            最近更新 更多