我正在尝试将表示函数(例如:f(x) = 2.5x + 10)的字符串转换为标记的ArrayList。这就是我的 token :
public enum Tokens
{
add,
sub,
mul,
div,
pow,
exp,
sin,
cos,
tan,
sec,
csc,
cot,
log,
x,
sta,
end;
}
我希望能够做的基本上是将 double 型转换为“ token ”类型,同时保留 double 型的值,以便可以以相同的方式表示常量以供以后处理,但我不这样做知道如何实现这一目标。
最佳答案
正如您所发现的,您的 Tokens
枚举不能真正用于实际 token ,因为无法制作不同版本的 Tokens.x
(我猜 Tokens.x 是用来表示公式中的数字...)以保存不同的数值。
您需要的是一个Token
类——一个“真正的”类——它可以保存(至少)一个 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
,因此它可以保存不同 token 类型可能需要的任何类型的值对象。
现在,在决定如何使用 type
和 value
属性来表示您的 token 时,有几种方法可供选择。
一种方法是将当前的 Tokens
枚举重命名为 TokenType
并使用其值作为您的类型。大多数 token 类型(例如 TokenType.csc
和 TokenType.add
)根本不需要任何值,因为 type
会告诉您所有信息需要知道。但数字标记需要知道其关联的数值,因此它们的 type
为 TokenType.x
,并且 value
将保存该数值作为 Double
、Integer
、BigDecimal
或其他。
但是,您可能会发现使用代表更广泛语法类别的标记类型更方便,例如“二元运算符”、“一元运算符”、“数字”、“公式结尾”:
public enum TokenType {BINOP, UNOP, NUMBER, END};
BINOP 和 UNOP token 将使用 value
属性来指示它们代表的特定运算符。枚举非常适合此目的:
public enum BinOps {ADD, SUB, MUL, ... };
public enum UnOps {SIN, COS, TAN, ... };
NUMBER 将在 value
属性中携带其数值(同样,如 Double
、Integer
、BigDecimal
, 管他呢)。 END token 不需要任何值
。
关于java - 在 Java 中将 double(基本类型)转换为枚举类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44192556/