【问题标题】:Java How to use an array in a switch methodJava如何在switch方法中使用数组
【发布时间】:2018-04-12 11:07:45
【问题描述】:

我正在尝试学习 Java,并且正在研究我的项目“程序集合”// 非常简单的项目:例如基本计算器、阶乘、反转数字等。 这些程序分为数学,绘图等类别...... 问题是,也许将来我会想要更多的类别/程序。 我想使用数组,所以每次添加新程序/类别时都不必重新编写代码。


我创建了一个字符串数组并更新了我的方法welcomeUser。 但我不知道如何处理我的 chooseBlock 方法和切换。 我想在我的数组中包含与块一样多的案例。

非常感谢您的每一个帮助


public class Program {

    Scanner scan = new Scanner(System.in);

    private boolean programRunning = true;

    public void run() {
        System.out.println("Welcome in my program! (version 1.0.0)");
        while (programRunning) {
            welcomeUser();
            chooseBlock();
        }

    }

    public void welcomeUser() {
        System.out.println("You can choose from these blocks:\n"
                + "[1.Mathematic Block]\t"
                + "[2.Drawing block]\t"
                + "[3.Else...]\t"
                + "[4.Exit]\n"
                + "Select with a number and press ENTER");
    }

    public void chooseBlock() {
        int block = 0;
        block = scan.nextInt();
        switch (block) {
            case 1:
                System.out.println("You've choosen Mathematic Block");
                Mathematics maths= new Mathematics();
                maths.run();
                break;
            case 2:
                System.out.println("You've choosen Drawing block");
                Drawings drawings = new Drawings();
                drawings.run();
                break;
            case 3:
                System.out.println("You've choosen Else block");
                break;
            case 4:
                System.out.println("Exiting the program");
                programRunning = false;
                break;
            default:
                System.out.println("Invalid input. Try again.");
                break;
        }
        System.out.println("");
    }

}

private String[] blocks
        = {"Mathematic Block", "Drawing Block", "Else", "Exit"};

public void welcomeUser() {

   System.out.println("You can choose from these blocks:\n");
   for (int i = 0; i < blocks.length; i++) {
        System.out.print("[" + (i + 1) + ". " + blocks[i] + " ]\t");
        if ((i + 1) % 4 == 0) {
            System.out.println();
        }
   }
   System.out.println();
   System.out.println("Select with a number and press ENTER");
}

【问题讨论】:

  • 您的问题是设计问题。 IE。如何使这个应用程序易于扩展。这是一个难题,通常不适合初学者。而且,对于这类问题,有不止一个好的答案。我建议使您的代码尽可能简单。这使以后的事情变得容易。当您现在不需要它们时,无需使用Arrays您想添加另一个类别时,您可以提出关于那个的问题。
  • 简短的回答,你想使用类似策略模式的东西。每个类别都有自己的战略实施。当您需要添加新类别时,您需要实施新策略。知道,而不是switch,您只需获取存储在数组中的Strategy 的实例,索引将匹配类别数组。简单而进化。但是第一次实施需要时间,因为您需要有一个明确定义的策略。策略或状态模式是两个相似的,我可能会将它们混合在一起......

标签: java arrays switch-statement


【解决方案1】:

基本上,您希望类别易于扩展。有很多方法可以实现这一目标。我将为初学者勾勒出一种方法。

首先,我会在 Category 之类的类中明确建模类别:

public abstract class Category {
    public abstract String getTitle();
    public abstract void run();
}

每个特定类别都有自己的类,扩展 Category

public class Mathematics extends Category {
    public String getTitle() { return "Mathematic Block";}
    public void run() { ... }
}

然后您将获得一个可用类别列表:

private List<Category> categories = Arrays.asList(new Mathematics(), ...);

现在您可以按如下方式显示可用类别列表:

public void welcomeUser() {
    System.out.println("You can choose from these blocks:");
    for (int index = 0; index < categories.size(); index++) { 
        Category category = categories.get(index);
        System.out.println("[" + (index+1) + "." + category.getTitle() + "]");
    }
    // ...
}

你可以这样做而不是 switch:

int block = scan.nextInt();
int selectedCategoryIndex = block - 1;
if (selectedCategoryIndex >= 0 && selectedCategoryIndex < categories.size()) {
    Category selectedCategory = categories.get(selectedCategoryIndex);
    selectedCategory.run();
}

如果有新类别,只需将其添加到categories

【讨论】:

  • 谢谢大家。我要试试。
  • @user9635657 如果你觉得我的回答对你有帮助,你可以accept my answer
猜你喜欢
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多