如果陈述更加明确

时间:2018-04-23 14:22:59

标签: java eclipse if-statement

通过将if语句与&&或其他内容相结合,是否可以更加明确?我已经尝试了很多,我似乎无法使它工作。如果我能在代码的一行或两行上得到任何示例,我将非常感激。订单必须保持不变。

public void actionPerformed(ActionEvent ae) {
    if (ae.getSource() == button[0])
        display.append("7");
    if (ae.getSource() == button[1])
        display.append("8");
    if (ae.getSource() == button[2])
        display.append("9");

    if (ae.getSource() == button[3]) {
        temporary[0] = Double.parseDouble(display.getText());
        function[0] = true;
        display.setText("");
    }
    if (ae.getSource() == button[4])
        display.append("4");
    if (ae.getSource() == button[5])
        display.append("5");
    if (ae.getSource() == button[6])
        display.append("6");
    if (ae.getSource() == button[7]) {

        temporary[0] = Double.parseDouble(display.getText());
        function[1] = true;
        display.setText("");
    }
    if (ae.getSource() == button[8])
        display.append("1");
    if (ae.getSource() == button[9])
        display.append("2");
    if (ae.getSource() == button[10])
        display.append("3");
    if (ae.getSource() == button[11]) {

        temporary[0] = Double.parseDouble(display.getText());
        function[2] = true;
        display.setText("");
    }
    if (ae.getSource() == button[12])
        display.append(".");
    if (ae.getSource() == button[13]) {

        temporary[0] = Double.parseDouble(display.getText());
        function[3] = true;
        display.setText("");
    }
    if (ae.getSource() == button[14])
        clear();
    if (ae.getSource() == button[15])
        getSqrt();
    if (ae.getSource() == button[16])
        getPosNeg();
    if (ae.getSource() == button[17])
        getResult();
    if (ae.getSource() == button[18])
        display.append("0");
}

5 个答案:

答案 0 :(得分:3)

在函数外部的某个地方,可能是final成员,我会定义一个哈希表。

final Map<JButton, String> translation = new HashMap<>();
translation.put(button[0],  "7");
translation.put(button[1],  "8");
translation.put(button[2],  "9");
translation.put(button[4],  "4");
translation.put(button[5],  "5");
translation.put(button[6],  "6");
translation.put(button[8],  "1");
translation.put(button[9],  "2");
translation.put(button[10], "3");
translation.put(button[12], ".");
translation.put(button[18], "0");
final Map<JButton, Integer> functions = new HashMap<>();
functions.put(button[3],  0);
functions.put(button[7],  1);
functions.put(button[11], 2);
functions.put(button[13], 3);
final Map<JButton, Runnable> runnables = new HashMap<>();
runnables.put(button[14], () -> { clear(); });
runnables.put(button[15], () -> { getSqrt(); });
runnables.put(button[16], () -> { getPosNeg(); });
runnables.put(button[17], () -> { getResult(); });

然后我会按如下方式使用它:

public void actionPerformed(ActionEvent ae) {
    if(translation.keySet().contains(ae.getSource())
    {
        display.append(translation.get(ae.getSource());
        return;
    }

    if(functions.keySet().contains(ae.getSource())
    {
        temporary[0] = Double.parseDouble(display.getText());
        function[functions.get(ae.getSource())] = true;
        display.setText("");
        return;
    }

    if(runnables.keySet().contains(ae.getSource())
    {
        runnables.get(ae.getSource()).run();
        return;
    }
}

答案 1 :(得分:1)

通过查看源代码来区分单个事件侦听器中要执行的操作,这是一种已经过时的技术。

最好是使用Action,并为每个按钮(构造函数或setAction)提供一个。

不太具有破坏性的替代方案是对每个按钮使用setActionCommand

// On initialisation:
button[0].setActionCommand("K7");
button[1].setActionCommand("K8");
button[2].setActionCommand("K9");
button[3].setActionCommand("F0");
button[4].setActionCommand("K4");
button[5].setActionCommand("K5");
button[6].setActionCommand("K6");
button[7].setActionCommand("F1");
button[8].setActionCommand("K1");
button[9].setActionCommand("K2");
button[10].setActionCommand("K3");
button[11].setActionCommand("F2");
button[12].setActionCommand("K.");
button[13].setActionCommand("F3");
button[14].setActionCommand("Mclear");
button[15].setActionCommand("Msqrt");
button[16].setActionCommand("Mposneg");
button[17].setActionCommand("Mresult");
button[18].setActionCommand("K0");

public void actionPerformed(ActionEvent ae) {
    string category = ae.getActionCommand().substring(0, 1); // K/F/M
    String parameter = ae.getActionCommand().substring(1);

    if (category.equals("K")) { // Key
        display.append(parameter);
    } else if category.equals("F")) { // Function
        int f = Integer.parseInt(parameter);
        temporary[0] = Double.parseDouble(display.getText());
        function[f] = true;
        display.setText("");
    } else if category.equals("M")) { // Math Operation
        if (parameter.equals("clear")) {
            clear();
        } else if (parameter.equals("sqrt")) {
            getSqrt();
        } else if (parameter.equals("posneg")) {
            getPosNeg();
        } else if (parameter.equals("result")) {
            getResult();
        }
    }
}

这将JButton与事件侦听器分离。因此,键7的键盘监听器可以用一些代码触发动作事件“K7”。

答案 2 :(得分:0)

    //Assumes it will aways be found
    int index = IntStream.range(0, 19).filter(i -> ae.getSource() == button[i]).findFirst().orElse(0);
    if(index < 3) {
        display.append(Integer.toString(index + 7));
    }
    if(index == 3) {
        temporary[0] = Double.parseDouble(display.getText());
        function[0] = true;
        display.setText("");
    }
    if(index > 3 && index < 7) {
        display.append(Integer.toString(index));
    }
    if(index == 7) {
        temporary[0] = Double.parseDouble(display.getText());
        function[1] = true;
        display.setText("");
    }
    if(index > 7 && index < 11) {
        display.append(Integer.toString(index-7));
    }
    if(index == 11) {
        temporary[0] = Double.parseDouble(display.getText());
        function[2] = true;
        display.setText("");
    }
    if(index == 12) {
        display.append(".");
    }
....

这使得它稍微短一点,但是如果你不能像Mark那样重新映射那些按钮,那么你就会被大致相同的结构所困扰,因为程序总会以这种或那种方式反映你的应用程序的逻辑。

编辑。 您也可以在转换为int后进行切换(因为开关需要恒定的条件)

    int index = IntStream.range(0, 19).filter(i -> ae.getSource() == button[i]).findFirst().orElse(0);
    switch(index) {
        case 0:
            display.append("7");
            break;
        case 1:
            display.append("8");
            break;
            ...
    }

答案 3 :(得分:0)

要将一对语句折叠为由逻辑条件连接的表达式,因此具有单个主体,这对语句必须具有相同(或至少相似)的主体。它似乎不是你的情况。

您可以尝试的一件事是强制按钮数组的特定顺序,并设计一个映射函数,以根据按钮所在的索引执行所需的操作。但这种方法根本不健全。

答案 4 :(得分:0)

您可以在display.append(...)这样的内容中写下所有for loop

表示0到2范围

IntStream.range(0,3).forEach(x -> {
  if (ae.getSource() == button[x])
    display.append(Integer.toString(x + 7));
 });