执行此功能的更好或更标准的方法是什么?

时间:2019-08-15 23:23:30

标签: java loops if-statement methods do-while

我是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)");
    }

}

2 个答案:

答案 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)

回答第一个问题:

  • 有许多设计模式和实践,所以很多人可以争论我建议您做什么。所有编程语言都基本相同。让我们来看一下函数“转换”。名称本身表示您使用它来转换内容。不显示,不提示-转换。在这种情况下,它唯一实际要做的就是将upperCase转换为小写。实际上,您可能想在函数名(convertToLowerCase?)中指定转换类型。实际上,在Java中,我们为所有函数名称使用 lowerCamelCase ,为类使用 UpperCamelCase
  • 如果您接受我先前的建议,则可以将Conversion函数分解为多个promptUserForInputWrongInputHandler等。

如果我正确地理解了您的第二个问题,您会想知道代码的执行方式以及如何将变量ans进一步传递到循环中。让我们看一下您的代码以及变量的作用:

  1. 通过使该类中的所有方法均可访问它来初始化类MyClass中的变量;
  2. 您使用行ans = new String(s.nextLine());提示用户输入要在do..while循环中分配给该变量的值,这行保存了变量的值,并且可以在整个类中对其进行访问,因此其值已更改。
  3. 它进入if..else if ... else语句。它的工作方式是逐行的-如果第一个 if-statement 失败,它会一直持续到找到 truthy 语句,并且不会继续进行下去。在您的情况下,如果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.)");
        }
}