public String速记(String in)

时间:2010-05-03 19:52:08

标签: java

我坚持使用此代码。

代码应该使用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(); 
    }
}

5 个答案:

答案 0 :(得分:2)

您没有传递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()方法。

答案 1 :(得分: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转换为Stringimplements 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]"

这使用String的{​​{3}}和length()方法。

或者,如果您不需要索引,也可以使用charAt(int index)代替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撰写所谓的“How do I apply the for-each loop to every character in a String in Java?”(例如return ""; )。它们还不正确,但重要的是它们现在可以编译。这使您有时间专注于run,以确保您有一个正常工作的循环,并且您能够从用户提取相关输入。您应该将代码带到编译和运行的位置,这样您就可以测试并确信您的run能够完成它需要做的事情。此时,您可以开始填写以前存根的方法,根据需要实现适当的功能。

如果您在实现这一目标时遇到困难,可以询问有关该作业的特定方面的问题(但首先在stackoverflow上搜索它!)。当你遇到问题时,这会给你提供高质量和有针对性的问题答案(反对提出这样一个有问题的代码,人们可以在它上面遍布它),因此对你自己来说更有启发性。

这个问题也可能对其他人更有用,因为它在上下文中更为通用(即它是关于如何编写用户提示循环,而不是如何做功课)(相比之下,这个问题目前标题为{ {1}})。

您可以做的另一件事是执行所谓的method stubspublic String shorthand(String in) GREAT 的候选人:要测试其正确性,您必须知道如何调用它(显然您遇到问题)。

所有这一切似乎都是不必要的工作。据推测,单元测试不是作业的一部分(虽然它可能应该是这样),编写存根然后用其他东西替换它似乎是浪费时间,你应该在第一次就把它弄好。正因为这是一项家庭作业,你应该采用和实践良好的软件开发过程的方法。这是为了你自己的利益。

另见

答案 2 :(得分:1)

您需要将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(); 
}

答案 3 :(得分:1)

你想要这样的东西

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中右键单击并运行它。

答案 4 :(得分:1)

请将此标记为作业

重点:这里有很多问题

首先,你需要让你的主实际上在每一行上调用shortHand,并且可能会打印结果。

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