【问题标题】:Converting a double (the primitive type) to an enumerated type in Java在 Java 中将 double(原始类型)转换为枚举类型
【发布时间】:2017-05-26 02:14:00
【问题描述】:

我正在尝试将表示函数(例如:f(x) = 2.5x + 10)的字符串转换为标记的 ArrayList。这就是我所拥有的令牌:

public enum Tokens
{
    add,
    sub,
    mul,
    div,
    pow,
    exp,
    sin,
    cos,
    tan,
    sec,
    csc,
    cot,
    log,
    x,
    sta,
    end;
}

我想做的基本上是将双精度转换为“令牌”类型,同时保留双精度的值,以便可以以相同的方式表示常量以供以后处理,但我不知道如何做到这一点。

【问题讨论】:

  • 枚举是有限值。您不能创建一个表示每个可能的双精度值的 Enum。但是您当然可以将值封装在其他类型的对象中。
  • 为什么不创建一个Token 类型,其字段包括(可能为空)Double 和(可能为空)TokenEnum

标签: java enums token tokenize


【解决方案1】:

正如您所发现的,您的 Tokens 枚举不能真正用于实际令牌,因为无法制作不同版本的 Tokens.x(我猜 Tokens.x 是为了代表公式中的数字...)来保存不同的数值。

你需要的是一个Token 类——一个“真正的”类——它可以保存(至少)一个令牌类型和一个值:

public class Token {
    private TokenType type;
    private Object value;
    public Token(TokenType type) { 
        this.type = type; 
        this.value = null;
    }
    public Token(TokenType type, Object value) { 
        this.type = type;
        this.value = value;
    }
    // getters and setters for type and value omitted below
    // ...
}

TokenType 将是一个枚举; value 属性是一个 Object,因此它可以包含您可能需要的不同令牌类型的任何类型的值对象。

现在,在决定如何使用 typevalue 属性来表示您的令牌时,有几种方法可供选择。

一种方法是将您当前的 Tokens 枚举重命名为 TokenType 并将其值用于您的类型。大多数令牌类型,例如TokenType.cscTokenType.add,根本不需要任何值,因为type 告诉您您需要知道的一切。但是数字标记需要知道它们关联的数值,因此它们将具有 typeTokenType.x,而 value 将保持数值为 DoubleIntegerBigDecimal 或其他任何值。

但是,您可能会发现使用表示更广泛句法类别的标记类型会更方便,例如“二元运算符”、“一元运算符”、“数字”、“公式结尾”:

public enum TokenType {BINOP, UNOP, NUMBER, END};

BINOP 和 UNOP 令牌将使用 value 属性来指示它们所代表的特定运算符。枚举非常适合此目的:

public enum BinOps {ADD, SUB, MUL, ... };
public enum UnOps {SIN, COS, TAN, ... };  

NUMBER 将在value 属性中携带它们的数值(同样,DoubleIntegerBigDecimal 或其他)。 END 令牌不需要任何value

【讨论】:

  • 另外,让Tokens 枚举实现一个接口,并且让其他类实现相同接口但保存数据(例如,Number 类包含一个数字,或一个 Identifier 类,其中包含一个类似“x”的字符串)。
【解决方案2】:

我不确定我是否完全理解您的问题。但是如果你想将枚举转换为双精度,你可以这样做。

public enum Tokens{
  add(2.0);

  private double value;
  Tokens(double value){
    this.value = value; 
  }

  public double getValue(){
    return this.value;
  }

  public static void main(String[] args) {
    System.out.println(Tokens.add.getValue());
    double a = 2.0;
    for (Tokens token:Tokens.values()) {
        if(a == token.getValue()){
            System.out.println(token);
        }
    }
  }
}

【讨论】:

  • 当我尝试添加这个时,Eclipse 会显示The constructor Tokens() is undefined
  • 添加主方法。它运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多