在Java中使用变量赋值实现if/else分支的更有效方法
变量“varOptions”通过扫描仪获得。基本上,我想:在Java中使用变量赋值实现if/else分支的更有效方法,java,performance,if-statement,Java,Performance,If Statement,变量“varOptions”通过扫描仪获得。基本上,我想:[A,B,C,D,E,F]变成:[0,1,2,3,4,5]。代码不区分大小写也是非常重要的。目前,这段代码相当庞大。我想知道是否有办法使这更有效 if ("A".equalsIgnoreCase(varOptions)) { int varOpt = 0; } else if ("B".equalsIgnoreCase(varOptions)) { int varOpt = 1; }
[A,B,C,D,E,F]
变成:[0,1,2,3,4,5]
。代码不区分大小写也是非常重要的。目前,这段代码相当庞大。我想知道是否有办法使这更有效
if ("A".equalsIgnoreCase(varOptions)) {
int varOpt = 0;
} else if ("B".equalsIgnoreCase(varOptions)) {
int varOpt = 1;
} else if ("C".equalsIgnoreCase(varOptions)) {
int varOpt = 2;
} else if ("D".equalsIgnoreCase(varOptions)) {
int varOpt = 3;
} else if ("E".equalsIgnoreCase(varOptions)) {
int varOpt = 4;
} else if ("F".equalsIgnoreCase(varOptions)) {
int varOpt = 5;
}
如果varOptions变量尚未转换为字符(与字符串相反),请将其转换为字符。一旦它是一个字符,您就可以将其转换为整数,这将把字符转换为ASCII码。“A”字符的ASCII码为65。B是66岁。C是67等等 要保持不区分大小写,请先将字符转换为大写,然后再转换为整数 因此,将其转换为整数后,只需减去65,就会得到一个介于0和5之间的数字:
int varOpt = (int)Character.toUppercase(varOptions);
varOpt -= 65;
上面的代码假设varOptions已经是char类型。注意,不需要将大小写转换为int,但提高了可读性。人们可以很容易地做到:
int varOpt = Character.toUppercase(varOptions);
完整代码示例,假设varOptions是字符串:
char varOptChar = varOptions.charAt(0); // grab first character
int varOpt = (int)Character.toUppercase(varOptChar);
varOpt = varOpt - 65;
对于您的示例,varOpt现在应该介于0和5之间。要理解这一点,您需要了解字符在计算机中具有十进制表示。计算机只看到数字65,但知道该数字表示大写字母A。65称为ASCII码;您可以在这里找到一个ASCII代码表:它没有那么漂亮,但您可以这样做
Map<String, Integer> map = new HashMap<String, Integer>()
{{
put("A", 1);
put("B", 2);
put("C", 3);
put("D", 4);
put("E", 5);
put("F", 6);
}};
// varOpt will be null if it is not in the map
int varOpt = map.get(varOptions.toUpperCase());
Map Map=newhashmap()
{{
付诸表决(“A”,1);
付诸表决(“B”,2);
put(“C”,3);
付诸表决(“D”,4);
付诸表决(“E”,5);
付诸表决(“F”,6);
}};
//如果varOpt不在映射中,则它将为null
int varOpt=map.get(varOptions.toUpperCase());
或
您还可以在字符串上使用开关:
int varOpt;
switch( varOptions.toUpperCase() ) {
case "A":
varOpt = 0; break;
case "B":
varOpt = 1; break;
// etc
}
或者使用映射
,如果您不想在连续范围内进行简单的字符到整数映射,那么可以使用映射。如何:
int varOpt = " ABCDEF".indexOf(varOptions.toUpperCase());
另一种方法是将字母解析为十六进制数,然后减去11:
int varOpt = Integer.parseInt(varOptions, 16) - 0xA;
地图查找是显而易见的方法。这只是针对那些特定的值吗?“G”怎么了?此外,这听起来更适合于代码审查。您是否有一个您试图解决的效率问题?如果输入不是a-F,会发生什么,或者不会发生什么?您能给我一个您所说的代码示例吗?很抱歉“我对Java语法不是很熟悉。”乔纳森·穆斯利补充道!代码本身并不复杂,但如果您不熟悉ASCII代码,我可以看出这可能会令人困惑。我试图补充一个简短的解释。@JonathanMousley没问题!我建议不要写-65
,而是写-'A'
,这样你就不需要ASCII表来理解代码了。我从来没有见过这种双花括号表示法。这是否会创建一个具有附加静态初始值设定项的HashMap匿名子类?@Teto-yup。人们通常也会因为以下几个原因而不鼓励使用DBI——“每次使用DBI,都会有一只小猫被杀。”
int varOpt = " ABCDEF".indexOf(varOptions.toUpperCase());
int varOpt = Integer.parseInt(varOptions, 16) - 0xA;