我坚持使用此代码。
代码应该使用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();
}
}
答案 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;
这更加清晰。
请注意在上面的代码中使用Character.toLowerCase
。实际上,通过使用例如,可以使代码更简单。 String.indexOf
:
public boolean isVowel(char ch) {
return "aeiouAEIOU".contains("" + ch);
}
这使用String.contains
,使用字符串连接有效地将char
转换为String
(implements CharSequence
)。
java.lang.Character
digit
,isXXX
和toXXX
方法非常有用java.lang.String
初学者倾向于写这样的东西:
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 stubs。 public 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函数。