我是Java初学者,在这个特殊的问题中,我练习了制作一个程序,将任何给定的字符串转换为小写字符串。在设计方面,是否有更好的方法可以在Java中实现这一目标?
此外,“ else”(在“ else if”之后)如何捕捉或等待我进行输入。即使我实现了想要的功能,但对于我来说,这部分内容对我来说毫无意义。输入中的“ ans”值如何传递到整个循环并在循环关闭之前一直使用?
经过多次尝试和失败,我为转换部分使用了单独的方法。我的第二个问题有点太复杂了,无法研究。
import static java.lang.System.out;
import java.util.Scanner;
public class MyClass {
public static Scanner s = new Scanner(System.in);
public static String ans;
public static void main(String args[]) {
Conversion();
do {
ans = new String(s.nextLine());
if (ans.equalsIgnoreCase("Y")) {
Conversion();
} else if (ans.equalsIgnoreCase("N")) {
out.println("Thank you for using this program!");
break;
} else {
out.println("Invalid entry!");
out.println("Would you like to convert another string?\n(Please type 'Y' for yes, or 'N' for no.)");
}
} while (ans != "N");
}//END MAIN
public static void Conversion() {
out.println("Please enter string to be converted to lowercase: ");
String str = new String(s.nextLine());
out.println("Your new string is: " + str.toLowerCase());
out.println("Would you like to convert another string? (Y/N)");
}
}
答案 0 :(得分:3)
我注意到一些问题; Conversion
看起来像一个类名(Java命名约定为conversion
),而ans != "N"
使用==
而不是.equals
-并且不会忽略大小写(!ans.equalsIgnoreCase("N")
)。全局变量(例如static
)是 bad (将Scanner
传递给需要它的方法),而static import
仅使代码难以推理(在我看来)。您当前的循环并没有真正遵循常规形式,我将提取提示和循环以将“另一个”转换为新方法,如果您必须打印一个谢谢,我会在“主循环”之后执行。像
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
do {
conversion(sc);
} while (another(sc));
System.out.println("Thank you for using this program!");
}
public static void conversion(Scanner s) {
System.out.println("Please enter string to be converted to lowercase: ");
System.out.printf("Your new string is: %s%n", s.nextLine().toLowerCase());
}
public static boolean another(Scanner s) {
while (true) {
System.out.println("Would you like to convert another string? (Y/N)");
String ans = s.nextLine();
if (ans.equalsIgnoreCase("Y")) {
return true;
} else if (ans.equalsIgnoreCase("N")) {
return false;
}
System.out.println("Invalid entry!");
System.out.println("(Please type 'Y' for yes, or 'N' for no.)");
}
}
答案 1 :(得分:1)
回答第一个问题:
Conversion
函数分解为多个promptUserForInput
,WrongInputHandler
等。 如果我正确地理解了您的第二个问题,您会想知道代码的执行方式以及如何将变量ans
进一步传递到循环中。让我们看一下您的代码以及变量的作用:
MyClass
中的变量; ans = new String(s.nextLine());
提示用户输入要在do..while循环中分配给该变量的值,这行保存了变量的值,并且可以在整个类中对其进行访问,因此其值已更改。ans
不等于y / Y /,它将转到else if
语句;如果不等于n / N,它将转到其他语句(所以基本上除了y /是/否/否),将被执行。之后,它跳到while (ans!= "N");
行,在此行中您比较类成员变量ans
,如果它不等于“ N”,它将在do{
部分之后重新开始循环,直到您输入“ N”。 我希望这是有道理的。每当程序要求您输入时,它都不会进一步执行代码,而是会停留在您提供任何输入之前。在整个循环和程序中,不会传递输入本身的值。之所以可以使用它,是因为您创建了一个更高范围的变量ans
,在其中保存了输入结果。
重要:如果您在do..while循环中声明了ans
内部,您将无法在其中访问它while (ans...)
,因为它将在do {... 此处 } while()之间的花括号之前“死”。如果您想进一步了解范围和变量,可以阅读this article。
这是我的代码示例:
public static void main(String args[]) {
//declare before entering the loop to have higher scope
String ans = "y";
do {
//we get the given string to convert from the user
String str = promptForString();
//we convert the string
str = converseStringToLowerCase(str);
//display the string (could use another function for that: easier to debug and locate problems and in bigger projects)
out.println("Your new string is: " + str);
//prompt user for respond to continue or not
ans = promptForContinue();
handleResponse(ans);
} while (!ans.equals("n"));
}//END MAIN
//prompts user for an input string
public static String promptForString() {
out.println("Please enter string to be converted to lowercase: ");
String str = new String(s.nextLine());
return str;
}
//converts any given string to lower case
public static String converseStringToLowerCase(String str) {
return str.toLowerCase();
}
//is used to prompt user for reply
public static String promptForContinue() {
out.println("Would you like to convert another string? (Y/N)");
String str = new String(s.nextLine());
//is good to make if...else statements easier - it will always be lower case (or upper if you prefer)
return str.toLowerCase();
}
//easier to locate other response scenarios
public static void handleResponse(String response) {
if (response.equals("n")) {
out.println("Thank you for using this program!");
//it's not a very good practice to innaturally break loops. Use input for that in while(..) statement
// break;
} else if (!response.equals("y")) {
out.println("Invalid entry!");
out.println("Would you like to convert another string?\n(Please type 'Y' for yes, or 'N' for no.)");
}
}