我正在编写一个返回给定字符是否有效的方法,如下所示: -
private static boolean isValid(char c) {
return c == '.' || c == ',' || c == '+' || c == '/' || c == ';' || c == ':';
}
检查样式标记了这一点,因为布尔复杂度太大(当它不应该超过3时为5)。我的开发经理已经标记了一些替代实现,我将作为答案发布。就个人而言,我认为我的代码足够可读,并且希望关闭此方法的检查样式。
您怎么看?
答案 0 :(得分:11)
private static boolean isValid(char c) {
String validChars =".,+/;:";
return (validChars.indexOf(c) > -1);
}
答案 1 :(得分:5)
private static boolean isValid(char c) {
switch (c) {
case '.' : // FALLTHROUGH
case ',' : // FALLTHROUGH
case '+' : // FALLTHROUGH
case '/' : // FALLTHROUGH
case ';' : // FALLTHROUGH
case ':' :
return true;
default : return false;
}
}
答案 2 :(得分:2)
private static boolean isValid(char c) {
/* CHECKSTYLE:OFF */
return c == '.' || c == ',' || c == '+' || c == '/' || c == ';' || c == ':';
/* CHECKSTYLE:ON */
}
答案 3 :(得分:2)
我会使用Set。它具有描述性名称的好处,并且可以很好地扩展。
private static Set<Character> validCharacters = new HashSet<Character>();
public static void initValidCharacters() {
validCharacters.add('.');
validCharacters.add(',');
validCharacters.add('+');
validCharacters.add('/');
validCharacters.add(';');
validCharacters.add(':');
}
private static boolean isValid(char c) {
return validCharacters.contains(c);
}
答案 4 :(得分:1)
private static boolean isValid(char c) {
char[] validChars2 = {'.', ',', '+', '/', ';', ':'};
for (char d : validChars2) {
if (c == d) { return true; }
}
return false;
}
答案 5 :(得分:0)
正则表达式可以很好地运行。我已将其硬编码到下面的示例中,但您可以轻松地将其从配置文件中拉出来。
[Test]
public void AisNotValid ()
{
Assert.IsFalse(IsValid('a'));
}
[Test]
public void SemiColonIsValid ()
{
Assert.IsTrue(IsValid(';'));
}
public bool IsValid(Char c)
{
return Regex.IsMatch(Regex.Escape(".,+/;:"), c.ToString());
}
Regex.Escape()方法在这里派上用场,因为它会转义通常在正则表达式中有意义的字符。从文档:“通过用它们的转义码替换它们来逃避一组最小的字符(\,*,+,?,|,{,[,(,),^,$,。,#和空格)。 “
答案 6 :(得分:0)
如果不考虑可读性,可以使用半二进制搜索来处理,布尔复杂度为3
作为char值的参考
+ 11
, 12
. 14
/ 15
: 26
; 27
private static boolean isValid(char c)
{
return c > 14 ? c == '/' || c == ';' || c == ':' : c == '.' || c == ',' || c == '+';
}