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;
好的,所以我只有两个案例。我只是想知道是否有一种方法我可以制作/使用该长表达式的快捷方式(重复),但因为我在不同的情况下使用它们,不同的 - 做 - (如果它通过&#39 ;如果'测试例如(案例34,调用减少方法,51为输入,案例35,调用减少方法,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子句中使用该变量,这样长代码块只出现一次,然后我会使用包含该变量的变量?
很抱歉,如果我无法解释更好......谢谢!
答案 0 :(得分:2)
考虑将您的Strings放在一个集合中,例如ArrayList或HashSet,然后通过contains(String)
方法查看集合中是否包含感兴趣的String。
作为附带建议,请勿使用==
或!=
比较字符串。请改用equals(...)
或equalsIgnoreCase(...)
方法。理解==
检查两个对象引用是否相同而不是您感兴趣的内容。另一方面,这些方法检查两个字符串是否具有相同的字符。同样的顺序,这就是重要的事情。
答案 1 :(得分:1)
传递给reduce
的值似乎比case
标签多17个。
您可以确保您启用的值在您需要的范围内,然后将value + 17
传递给reduce
。
if (value >= x && value <= y)
{
if (/* really long conditions here */)
{
reduce(value + 17);
}
}
如果案例标签与传递给reduce
的值之间没有数学关系(并且“加17”只是您展示的2个案例的巧合),那么创建一个{{1大小写标签,以减少调用Map<Integer, Integer>
时要使用的值。
这样就无需为每种情况一遍又一遍地复制长reduce
条件。
其次,在if
中放置getName()
的所有可能值,并调用List<String>
以查看它是否与其中一个匹配。
contains
答案 2 :(得分:0)
您可以使用可接受的令牌创建一个列表
List<String> tokens = Arrays.asList(TokenName.PROG_NAME.toString(), "DECENT", ...);
然后检查
tokens.contains(cToken.getName())
答案 3 :(得分:0)
您可以在TokenName类中添加方法getReductionFactor()
吗?然后打电话
reduce(value + cToken.getReductionFactor());
并完成它。