Hiii。所以我有这些很长的切换案例,我有这些代码:
case 34:
if(cToken.getName() == TokenName.PROG_NAME.toString()
|| cToken.getName() == "DEDENT"
|| cToken.getName() == TokenName.ASSIGN.toString()
|| cToken.getName() == TokenName.PROC_CALL.toString()
|| cToken.getName() == TokenName.BREAK.toString()
|| cToken.getName() == TokenName.CONTINUE.toString()
|| cToken.getName() == TokenName.DATATYPE_BOOL.toString()
|| cToken.getName() == TokenName.DATATYPE_CHAR.toString()
|| cToken.getName() == TokenName.DATATYPE_FLOAT.toString()
|| cToken.getName() == TokenName.DATATYPE_INT.toString()
|| cToken.getName() == TokenName.DATATYPE_STRING.toString()
|| cToken.getName() == TokenName.DATATYPE_VOID.toString()
|| cToken.getName() == TokenName.INPUT.toString()
|| cToken.getName() == TokenName.OUTPUT.toString()
|| cToken.getName() == TokenName.IF.toString()
|| cToken.getName() == TokenName.DO.toString()
|| cToken.getName() == TokenName.WHILE.toString()
|| cToken.getName() == TokenName.INC_OP.toString()
|| cToken.getName() == TokenName.DEC_OP.toString()){
reduce(51);
} else {
error();
} break;
case 35:
if(cToken.getName() == TokenName.PROG_NAME.toString()
|| cToken.getName() == "DEDENT"
|| cToken.getName() == TokenName.ASSIGN.toString()
|| cToken.getName() == TokenName.PROC_CALL.toString()
|| cToken.getName() == TokenName.BREAK.toString()
|| cToken.getName() == TokenName.CONTINUE.toString()
|| cToken.getName() == TokenName.DATATYPE_BOOL.toString()
|| cToken.getName() == TokenName.DATATYPE_CHAR.toString()
|| cToken.getName() == TokenName.DATATYPE_FLOAT.toString()
|| cToken.getName() == TokenName.DATATYPE_INT.toString()
|| cToken.getName() == TokenName.DATATYPE_STRING.toString()
|| cToken.getName() == TokenName.DATATYPE_VOID.toString()
|| cToken.getName() == TokenName.INPUT.toString()
|| cToken.getName() == TokenName.OUTPUT.toString()
|| cToken.getName() == TokenName.IF.toString()
|| cToken.getName() == TokenName.DO.toString()
|| cToken.getName() == TokenName.WHILE.toString()
|| cToken.getName() == TokenName.INC_OP.toString()
|| cToken.getName() == TokenName.DEC_OP.toString()){
reduce(52);
} else {
error();
} break;
好的,这只是我的两个案例。我只是想知道是否有一种方法可以为长表达式(重复)创建/使用快捷方式,但因为我在不同的情况下使用它们,有不同的待办事项(如果它通过了"if"测试,例如(情况34,调用reduce方法,输入51,情况35,调用reduct方法,输出52)
基本上,我想问的是,是否有一种方法可以让我放
cToken.getName() == TokenName.PROG_NAME.toString()
|| cToken.getName() == "DEDENT"
|| cToken.getName() == TokenName.ASSIGN.toString()
|| cToken.getName() == TokenName.PROC_CALL.toString()
|| cToken.getName() == TokenName.BREAK.toString()
|| cToken.getName() == TokenName.CONTINUE.toString()
|| cToken.getName() == TokenName.DATATYPE_BOOL.toString()
|| cToken.getName() == TokenName.DATATYPE_CHAR.toString()
|| cToken.getName() == TokenName.DATATYPE_FLOAT.toString()
|| cToken.getName() == TokenName.DATATYPE_INT.toString()
|| cToken.getName() == TokenName.DATATYPE_STRING.toString()
|| cToken.getName() == TokenName.DATATYPE_VOID.toString()
|| cToken.getName() == TokenName.INPUT.toString()
|| cToken.getName() == TokenName.OUTPUT.toString()
|| cToken.getName() == TokenName.IF.toString()
|| cToken.getName() == TokenName.DO.toString()
|| cToken.getName() == TokenName.WHILE.toString()
|| cToken.getName() == TokenName.INC_OP.toString()
|| cToken.getName() == TokenName.DEC_OP.toString()
到一个变量或某个占位符,然后在if子句中使用该变量,这样长代码块只出现一次,然后我只使用包含它的变量?
对不起,如果我不能更好地解释。。非常感谢。
考虑将String放入一个集合中,例如ArrayList或HashSet,然后通过contains(String)
方法查看该集合中是否包含感兴趣的String。
作为附带建议,不要使用==
或!=
来比较Strings。请改用equals(...)
或equalsIgnoreCase(...)
方法。理解==
检查两个对象引用是否相同,这不是你感兴趣的。另一方面,方法检查两个String是否具有相同顺序的相同字符,这就是这里重要的。
传递给reduce
的值似乎比case
标签多17。
您可以确保打开的值在所需的范围内,然后将value + 17
传递给reduce
。
if (value >= x && value <= y)
{
if (/* really long conditions here */)
{
reduce(value + 17);
}
}
如果事例标签和传递给reduce
的值之间没有数学关系("加17"只是您显示的两个事例的巧合),那么创建一个事例标签的Map<Integer, Integer>
,以减少调用reduce
时使用的值。
这将消除对每种情况反复复制长if
条件的需要。
其次,将getName()
的所有可能值放在List<String>
中,并调用contains
以查看它是否与其中一个匹配。
if (listOfValues.contains(cToken.getName()) {
您可以使用可接受的令牌创建一个列表
List<String> tokens = Arrays.asList(TokenName.PROG_NAME.toString(), "DECENT", ...);
然后用检查
tokens.contains(cToken.getName())
你能给你的TokenName类添加一个方法getReductionFactor()
吗?然后打电话给
reduce(value + cToken.getReductionFactor());
并用它完成。