在 Java 中将 double(原始类型)转换为枚举类型
Converting a double (the primitive type) to an enumerated type in Java
我正在尝试将表示函数(例如: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;
}
我想做的基本上是将 double 转换为 "Tokens" 类型,同时保留 double 的值,以便可以用相同的方式表示常量以供以后处理,但是我不知道如何完成这个。
我不确定我是否完全理解你的问题。但是如果你想把enum转换成double,你可以这样做。
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);
}
}
}
}
正如您所发现的,您的 Tokens
枚举不能真正用于实际标记,因为无法制作 Tokens.x
的不同版本(我猜 Tokens.x
用于表示公式中的数字...)以保存不同的数值。
你需要的是一个Token
class--一个"real" class--它可以(至少)包含一个令牌类型和一个值:
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
,因此它可以容纳您可能需要的不同令牌类型的任何类型的值对象。
现在,在决定如何使用 type
和 value
属性来表示您的令牌时,有几种方法可供选择。
一种方法是将您当前的 Tokens
枚举重命名为 TokenType
并将其值用于您的类型。大多数标记类型,例如 TokenType.csc
和 TokenType.add
,根本不需要任何值,因为 type
告诉您需要知道的一切。但是数字标记需要知道它们相关的数值,所以它们会有 TokenType.x
的 type
,而 value
会将数值保存为 Double
,[=31] =]、BigDecimal
或其他。
但是,您可能会发现使用表示更广泛句法类别的标记类型会更方便,例如 "binary operator"、"unary operator"、"number"、"end-of-formula" :
public enum TokenType {BINOP, UNOP, NUMBER, END};
BINOP 和 UNOP 令牌将使用 value
属性来指示它们所代表的特定运算符。枚举非常适合此目的:
public enum BinOps {ADD, SUB, MUL, ... };
public enum UnOps {SIN, COS, TAN, ... };
NUMBER 将在 value
属性中携带它们的数值(同样,如 Double
、Integer
、BigDecimal
或其他)。 END 令牌不需要任何 value
。
我正在尝试将表示函数(例如: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;
}
我想做的基本上是将 double 转换为 "Tokens" 类型,同时保留 double 的值,以便可以用相同的方式表示常量以供以后处理,但是我不知道如何完成这个。
我不确定我是否完全理解你的问题。但是如果你想把enum转换成double,你可以这样做。
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);
}
}
}
}
正如您所发现的,您的 Tokens
枚举不能真正用于实际标记,因为无法制作 Tokens.x
的不同版本(我猜 Tokens.x
用于表示公式中的数字...)以保存不同的数值。
你需要的是一个Token
class--一个"real" class--它可以(至少)包含一个令牌类型和一个值:
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
,因此它可以容纳您可能需要的不同令牌类型的任何类型的值对象。
现在,在决定如何使用 type
和 value
属性来表示您的令牌时,有几种方法可供选择。
一种方法是将您当前的 Tokens
枚举重命名为 TokenType
并将其值用于您的类型。大多数标记类型,例如 TokenType.csc
和 TokenType.add
,根本不需要任何值,因为 type
告诉您需要知道的一切。但是数字标记需要知道它们相关的数值,所以它们会有 TokenType.x
的 type
,而 value
会将数值保存为 Double
,[=31] =]、BigDecimal
或其他。
但是,您可能会发现使用表示更广泛句法类别的标记类型会更方便,例如 "binary operator"、"unary operator"、"number"、"end-of-formula" :
public enum TokenType {BINOP, UNOP, NUMBER, END};
BINOP 和 UNOP 令牌将使用 value
属性来指示它们所代表的特定运算符。枚举非常适合此目的:
public enum BinOps {ADD, SUB, MUL, ... };
public enum UnOps {SIN, COS, TAN, ... };
NUMBER 将在 value
属性中携带它们的数值(同样,如 Double
、Integer
、BigDecimal
或其他)。 END 令牌不需要任何 value
。