算术运算符作为枚举?

Arithmetic Operator as enum?

我的程序提示用户 select 算术运算符(+、-、*、/)之一,并将他们的响应存储在变量 inOperator 中。在下面的 case 语句中(位于 main 方法中),我想相应地设置一个 positiveOperatonnegativeOperation.

switch (inOperator){
        case 1: operator = '+';
            //positiveOperation = plus
            //negativeOperation = minus
        break;

        case 2: operator = '-';
            //positiveOperation = minus
            //negativeOperation = plus
        break;

       ...
    }

我已经创建了一个枚举初始化算术运算:

public enum Operator
{        
    plus("+") {
        @Override public double apply(double v1, double v2) {
        return v1 + v2;
        }
    },
    minus("-") {
        @Override public double apply(double v1, double v2) {
            return v1 - v2;
        }
    },

    ...

    private final String text;
    private Operator(String text) {
        this.text = text;
    }
    public abstract double apply(double x1, double x2);
    @Override public String toString() {
        return text;  
    }
}

回到case语句,我如何设置positiveOperationnegativeOperation?我可以创建另一个 初始化 两者的枚举吗?

我不确定我理解这个问题,也不知道你为什么要这样做。以下是您的意思吗?

switch (inOperator) {
case 1:
    operator = '+';
    positiveOperation = Operator.plus;
    negativeOperation = Operator.minus;
    break;

case 2:
    operator = '-';
    positiveOperation = Operator.minus;
    negativeOperation = Operator.plus;
    break;

// ...

}

要将用户输入转换为您的运算符之一,您可以编写如下函数:

public Operator operatorFromInput(char input) {
    switch (input) {
    case '+':
        return Operator.plus;
    case '-':
        return Operator.minus;
    }
    return null;
}

将此添加到您的枚举中:

public static Operator fromChar(String operator) {
    for (Operator op : Operator.values()) {
        if (op.text.equals(operator)) return op;
    }
    throw new IllegalArgumentException("Received a fishy operator: " + operator);
}

然后一旦你阅读了 inOperator 你就可以做:

Operator operator = Operator.fromChar(inOperator);
int y = operator.apply(x1, x2);

这可能对你有用:

public enum Operator implements BinaryOperator<Double> {
    plus("+") {
        public Double apply(Double v1, Double v2) {
            return v1 + v2;
        }
    },
    minus("-") {
        public Double apply(Double v1, Double v2) {
            return v1 - v2;
        }
    };

    private final String text;

    Operator(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public static Operator from(String str) {
        return Arrays.stream(values()).filter(o -> o.text.equals(str)).findFirst()
            .orElseThrow(IllegalArgumentException::new);
    }
}