Java 大量if语句的快速替代方案

Java 大量if语句的快速替代方案,java,if-statement,Java,If Statement,我是java的初学者,我正在制作一个简单的程序,我在其中键入一些内容,如果我键入的内容与“数据库”中的某个内容匹配,那么它将打印一些文本。是否有比执行此操作更简单的检查方法: int 1; int 2; int 3; 等等 400次。使用switch语句或HashMap Switch语句:可读,但编译方式与if-else链类似(如果不相同) switch([USER_INPUT]) { case 1: System.out.println("TEST");

我是java的初学者,我正在制作一个简单的程序,我在其中键入一些内容,如果我键入的内容与“数据库”中的某个内容匹配,那么它将打印一些文本。是否有比执行此操作更简单的检查方法:

int 1;
int 2;
int 3;
等等


400次。

使用switch语句或HashMap

Switch语句:可读,但编译方式与if-else链类似(如果不相同)

switch([USER_INPUT]) {
    case 1:
        System.out.println("TEST");
        break;
    case 2:
        System.out.println("HELLO");
        break;
    // And so on.
}
:可读性更强,更简单。这是首选

// Initialization.
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1,"TEST");
map.put(2,"HELLO");

// Printing.
String s = map.get(USER_INPUT);
if (s == null)
    System.out.println("Key doesn't exist.");
System.out.println(s);
//初始化。
Map Map=newhashmap();
地图放置(1,“测试”);
放(2,“你好”);
//印刷。
字符串s=map.get(用户输入);
如果(s==null)
System.out.println(“密钥不存在”);
系统输出打印项次;

使用
开关
语句

switch(i){ 
    case 1:
    System.out.println("Hi");
    break;
    case 2:
    System.out.println("Ok");
    break;
    // ...
}

使用哈希映射,键为整数,值为文本

System.out.println(myMap.get(USER_INPUT));
你在哪里做了
myMap.put(1,“TEST”)等等,这会使您的代码更加面向对象


switch和if的基本字节码非常相似,个人认为切换到switch没有任何好处(除非你想失败,这意味着不要包含break语句)。

你可以使用switch语句

switch(i){ 
    case 1:
    System.out.println("Hi");
    break;
    case 2:
    System.out.println("Ok");
    break;
    // ...
}
这里有一个快速教程和一些更深入的解释。
另一个有趣的选择是使用枚举。如果要定义一个类中的所有值,这将起作用。它将简化用于获取文本值的代码。除了switch语句之外,它还为您提供了一些更有趣的选项

enum NumberText {
    HELLO(1),
    WORLD(2);

    private static final HashMap<Integer,NumberText> map = new HashMap<Integer,NumberText>();
    static{
        for (ConnectionGenerator c : ConnectionGenerator.values()) {
            map.put(c.code, c);
        }
    }

    Integer code;

    NumberText(Integer pCode) {
        this.code = pCode;
    }

    Static ConnectionGenerator getTextFor(Integer code) {
        return map.get(code);
    }
}   
您可以使用fancier,在枚举中添加一个额外的构造函数变量,并拥有一个特定的文本字符串

enum NumberText {
    HELLO(1, "Hello to You"),
    GOODBYE(2, "Goodbye");

    private static final HashMap<Integer,NumberText> map = new HashMap<Integer,NumberText>();
    static{
        for (ConnectionGenerator c : ConnectionGenerator.values()) {
            map.put(c.code, c);
        }
    }

    Integer code;
    String text;

    NumberText(Integer pCode, String pText) {
        this.code = pCode;
        this.text = pText;
    }

    ConnectionGenerator getNumberTextFor(Integer code) {
        return map.get(code);
    }

    getText() {
    return this.text;
}
}   

您可以使用开关,或将int/strings/anywhere映射到actions(
Runnable
函数
,等等)。你能添加一个层次结构来将400个命令分成子组吗?如果其中一个答案回答了你的问题,那么将其标记为答案。或者添加注释以便人们可以改进他们的答案。为什么这比If更好?我应该详细说明哈希图。@Nimchinpsky它是“大量If语句的快速替代方案”。在枚举上特别强大,在枚举中可以轻松演示完全覆盖。向读者保证不会使用更复杂的条件,如
i<5&&length>6
,因此无需详细阅读案例。忽略导致错误的中断是一个已知的问题,理想情况下编译器会警告您这一点。主题可读性是唯一的优势?使用哈希映射。@djechlin枚举?使用枚举映射。调换和假摔一样糟糕,伊莫。
enum NumberText {
    HELLO(1, "Hello to You"),
    GOODBYE(2, "Goodbye");

    private static final HashMap<Integer,NumberText> map = new HashMap<Integer,NumberText>();
    static{
        for (ConnectionGenerator c : ConnectionGenerator.values()) {
            map.put(c.code, c);
        }
    }

    Integer code;
    String text;

    NumberText(Integer pCode, String pText) {
        this.code = pCode;
        this.text = pText;
    }

    ConnectionGenerator getNumberTextFor(Integer code) {
        return map.get(code);
    }

    getText() {
    return this.text;
}
}   
NumberText.getNumberTextFor(USER_INPUT).getText();