【问题标题】:public String shorthand(String in)公共字符串速记(字符串输入)
【发布时间】:2011-02-15 04:32:45
【问题描述】:

我被困在这段代码上。

代码应使用 StringBuilder 类来构建输出字符串,方法是将其参数中的非元音字符附加到返回的结果中。它需要使用我创建的辅助方法来识别要删除的元音,该方法是公共布尔 isVowel(char c)。

public String shorthand(String in) 这是我需要帮助的方法。我已经创建了 stringbuilder 但 if 条件不接受 isVowel 方法。

import java.io.*;
import java.util.*;


public class Shorthand
{    

    public boolean isVowel(char c)
   {

       if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || c == 'A'|| c == 'E'||c == 'I'|| c == 'O'|| c == 'U')
       {
           return true;
       }
       else
       {
           return false;
       }
   }

    //TODO Complete the shorthand method
    public String shorthand(String in) //this is the code I need help with
    {
      StringBuilder vowel = new StringBuilder();

      if (isVowel() == false)
      { 
        vowel.append(in); 
       } 
          return vowel.toString(); 
    }

    //TODO Complete the run method
    public void run() throws IOException
    {
       String yourLine; 
       Scanner sc = new Scanner(System.in); 
       yourLine = sc.nextLine(); 
       while(!yourLine.equals("*"));
       {
            System.out.println("Enter your line of text");
       }
       yourLine = sc.nextLine(); 
    }
}

【问题讨论】:

    标签: java


    【解决方案1】:

    你没有传递 isVowel() 的 char c 参数

    试试这个:

    public String shorthand(String in) { 
            StringBuilder vowel = new StringBuilder();
    
            for (char c : in.toCharArray()) {
                if (!isVowel(c)) {
                    vowel.append(c);
                }
            }
    
            return vowel.toString();
    }
    

    编辑:您的run() 方法似乎有点奇怪......

    也许以下就是你想要的?

    public void run() throws IOException
    {
        String yourLine;
        Scanner sc = new Scanner(System.in);
        while (!sc.nextLine().equals("*")) {
            System.out.println("Enter your line of text");
        }
    }
    

    顺便说一句,它甚至不调用shorthand() 方法。

    【讨论】:

    • 我已经使用 Netbeans 尝试过这段代码,它在输入文本时没有任何反应,它说正在构建并且仍然有输入文本框任何想法
    • 这里有个小错别字——你在 stringBuilder 后面加上“in”,当然应该是“c”。
    【解决方案2】:

    从您的代码中可以学到很多东西。

    返回布尔表达式时

    这是isVowel(char ch)的改进版:

    public boolean isVowel(char ch) {
        ch = Character.toLowerCase(ch);
        return (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
    }
    

    注意两点:

    • ch 被简化为小写形式,因此您的检查次数要少得多
    • 没有if 声明。

    这里有一个重要的教训:你不应该写这样的东西:

    if (expression) {
       return true;
    } else {
       return false;
    }
    

    你应该总是写:

    return expression;
    

    这要清楚得多了。


    关于熟悉 Java 库

    注意上面代码中Character.toLowerCase的使用。事实上,可以通过使用使代码更简单,例如String.indexOf:

    public boolean isVowel(char ch) {
        return "aeiouAEIOU".contains("" + ch);
    }
    

    这使用String.contains,使用字符串连接将char 有效地转换为String(其中implements CharSequence)。

    API 链接

    另见


    不要与布尔常量比较

    初学者倾向于这样写:

    if (expression1 == false) {
    }
    //...
    if (expression2 == true) {
    }
    

    尤其是在 Java 中,你应该学会这样写:

    if (!expression1) {
    }
    //...
    if (expression2) {
    }
    

    这更清晰,更不容易出错。

    另见


    关于遍历String 的每个字符

    这里有一个简单的循环来展示索引方式是如何做到这一点的:

        String s = "Abracadabra";
        for (int i = 0; i < s.length(); i++) {
            System.out.print("[" + s.charAt(i) + "]");
        } // prints "[A][b][r][a][c][a][d][a][b][r][a]"
    

    这使用了Stringlength()charAt(int index) 方法。

    或者,如果您不需要索引,您也可以使用String.toCharArray()char[] 上执行foreach。这不节省空间(char[] 必须重新分配以保证不变性),但非常易读且简洁:

        String s = "Abracadabra";
        for (char ch : s.toCharArray()) {
            System.out.print("[" + ch + "]");
        } // prints "[A][b][r][a][c][a][d][a][b][r][a]"
    

    另见


    关于软件开发过程

    正如其他人所提到的,您的 run 方法存在很大问题:它目前导致无限循环。

    你可以做的是为isVowel(例如简单的return true;)和shorthand(例如简单的return "";)编写所谓的“method stubs”。它们还不正确,但重要的是它们现在可以编译。这让您有时间专注于run,以确保您有一个正常工作的循环,并且您能够从用户那里提取相关输入。您应该将代码带到它编译和运行的位置,这样您就可以测试并确信您的run 完成了它需要做的事情。此时,您可以开始填写以前存根的方法,根据需要实现适当的功能。

    如果您难以做到这一点,您可以就作业的特定方面提出问题(但请先在 stackoverflow 上搜索!)。这可以在遇到问题时为您提供高质量和集中的答案(而不是提出这样一个有问题的代码,以至于人们可以在上面到处走动),因此对您自己而言更具指导性。

    这个问题也可能对其他人更有用,因为它在上下文中更普遍(即它是关于如何编写用户提示循环,而不是关于如何做你的作业)(相比之下,这个问题目前的标题是@ 987654373@).

    您可以做的另一件事是执行所谓的unit testsisVowel 是一个GREAT候选者:要测试它的正确性,你必须知道如何调用它(你显然有问题)。

    所有这些起初似乎都是不必要的工作。据推测,单元测试不是作业的一部分(尽管它可能应该是),编写存根然后用其他东西替换它似乎是浪费时间,而你应该第一次就把它做好。但是,正是因为这是一项家庭作业,您应该采用并实践良好的软件开发过程的方法。这是为了你好。

    另见

    【讨论】:

      【解决方案3】:

      您需要将 char 值传递给 isVowel() 方法。请尝试以下操作:

      public String shorthand(String in) 
      {
        StringBuilder vowel = new StringBuilder();
      
        for (int i=0; i < in.length(); i++)
        {
            if (isVowel(in.charAt(i)) == false)
            { 
              vowel.append(in.charAt(i)); 
            }
        } 
        return vowel.toString(); 
      }
      

      【讨论】:

        【解决方案4】:

        请将此标记为作业

        直截了当:这里有很多问题

        首先,您需要让 main 在每一行上实际调用 shortHand,并可能打印结果。

        其次,你的速记函数应该遍历字符串的所有字符,现在你没有这样做。您将把每个字符传递给 isVowel 函数。

        【讨论】:

        • 另外,if (isVowel...) 行上的“强文本”错字
        【解决方案5】:

        你想要这样的东西

        public String shorthand(String in)
        {
              int length = in.length();
              StringBuilder noVowels = new StringBuilder(length);
              for (int i=0; i<length; i++)
              {
                 c = in.charAt(i);
                 if (!isVowel(c))
                   noVowels.append(c);
              }
              return noVowels.toString(); 
        }
        

        PS:您的 isVowel 方法只检查小写字母。如果要同时识别大写和小写的元音,请在 isVowel 的第一行调用Character.toLowerCase

        编辑:我没有评论 run() 方法,因为我认为它正在进行中。由于您对此有疑问,这里有一个更正的版本。

        public static void main(Stirng[] args) throws IOException
        {
           Scanner sc = new Scanner(System.in);
           for(;;) {
            System.out.println("Enter your line of text");
            String line = sc.nextLine();
            if (line.equals("*")) break;
            String shortHandLine = shorthand(line);
            System.out.println(String.format("Shorthand form of %s is %s", line, shortHandLine));
           }    
        }
        

        由于这是一个应用程序,您可以在大多数 IDE 中右键单击并运行它。

        【讨论】:

          猜你喜欢
          • 2013-09-27
          • 1970-01-01
          • 2021-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-26
          • 2010-11-04
          • 2013-03-18
          相关资源
          最近更新 更多