java—减少if语句的数量,或者用for或switch或其他

t8e9dugd  于 2021-06-29  发布在  Java
关注(0)|答案(4)|浏览(335)

我的 if 以及 else if 条件太长。有没有可能 for 或者 while 或者 switch 或者任何其他可以减少代码并使其更易于理解的函数?
除此之外,代码运行良好。

if((text.charAt(7)=='O' || text.charAt(7)=='X')
        && (text.charAt(8)=='O' || text.charAt(8)=='X')
        && (text.charAt(9)=='O' || text.charAt(9)=='X') 
        && (text.charAt(10)=='O'|| text.charAt(10)=='X')
        && text.charAt(49)=='O'
        && text.charAt(50)=='O'
        && text.charAt(51)=='X')
 {
    ledGeneral.setBackgroundResource(R.drawable.ledverte);
}else if (text.charAt(7)=='A' 
        || text.charAt(8)=='A'
        || text.charAt(9)=='A'
        || text.charAt(10)=='A'
        || text.charAt(49)=='A'
        || text.charAt(50)=='A')
{
    ledGeneral.setBackgroundResource(R.drawable.ledgeneralrouge);
}else{
    ledGeneral.setBackgroundResource(R.drawable.imageverte);
}
p4tfgftt

p4tfgftt1#

如果要检查的索引是固定的:

if(text.matches(".{7}[OX][OX][OX][OX].{38}OOX.*")){
    ledGeneral.setBackgroundResource(R.drawable.ledverte);
}
else if (text.substring(7, 11).contains("A") || text.substring(49, 51).contains("A")){
    ledGeneral.setBackgroundResource(R.drawable.ledgeneralrouge);
}
else{
    ledGeneral.setBackgroundResource(R.drawable.imageverte);
}

{38}和{7}也被称为量词。匹配上一个标记的指定数量。例子:
[x] {1,3}将匹配1到3个x。
{3} 正好匹配3。
{3,}将匹配3个或更多。
一般来说,[x]{min,max}:将min与max x匹配,[x]{n}精确匹配nx,[x]{min,}至少匹配min x或更多。
还有圆点 . 表示匹配任何字符。所以呢 .{38} 意思是匹配任意字符38次
因为你的情况可以解释为:
匹配一个字符串
以任意7个字符开头(索引0-6)
和一个 O 或者 X 在第7、8、9和10个指数
以及从第11个到第48个索引的任何字符(38个字符)
和一个 O 第49和第50指数
和一个 X 第51指数
转换为正则表达式 ....... 或更短 .{7} (任意字符正好7次) [OX][OX][OX][OX] char类中指定的与索引7、8、9、10相对应的字符之一 ....................................... 或更短 .{38} (任意字符正好38次)
紧接着就是 OOX 指数49,50,51 .* 可选的在末尾添加零个或多个字符
所以长版本可能是:

.......[OX][OX][OX][OX]......................................OOX.*

更短的

.{7}[OX][OX][OX][OX].{38}OOX.*
fkaflof6

fkaflof62#

您可以尝试以下方法,尽管我怀疑这是否会使其更具可读性:

final boolean firstCondition = IntStream.of(7, 8, 9, 10)
        .mapToObj(text::charAt)
        .allMatch(character -> character == 'O' || character == 'X')
          && text.charAt(49) == 'O'
          && text.charAt(50) == 'O'
          && text.charAt(51) == 'X';
final boolean secondCondition = IntStream.of(7, 8, 9, 10, 49, 50)
        .mapToObj(text::charAt)
        .anyMatch(character -> character == 'A');

if (firstCondition) {
    //
} else if (secondCondition) {
    //
} else {
    //
}
2fjabf4q

2fjabf4q3#

您可以创建一个辅助函数来处理:

static boolean check_letter(String text, char to_check, int ...pos){
    for (int po : pos) {
        if (text.charAt(po) == to_check)
            return true;
    }
    return false;
}

然后调整if和else:

if((check_letter(text, 'O', 7, 8, 9, 10) || check_letter(text, 'X', 7, 8, 9, 10)) && text.charAt(49) == 'O' && text.charAt(50) == 'O' && text.charAt(51) == 'X')
{
  ...
}
else if (check_letter(text, 'A', 7, 8, 9, 10, 49, 50))
{
 ...
}
8wtpewkr

8wtpewkr4#

关于代码“清洁度”的问题,我建议用描述性的方法来表达。

private boolean shouldSetBackgroundLedverte(text){
  return (text.charAt(7)=='O' || text.charAt(7)=='X') && (text.charAt(8)=='O'|| 
         text.charAt(8)=='X')&& (text.charAt(9)=='O'|| text.charAt(9)=='X') && 
         (text.charAt(10)=='O'|| text.charAt(10)=='X')&& text.charAt(49)=='O'&& 
         text.charAt(50)=='O'&& text.charAt(51)=='X';
}

private boolean shouldSetBackgroundLedgeneralrouge(text){
  return text.charAt(7)=='A' || text.charAt(8)=='A'|| text.charAt(9)=='A'|| 
         text.charAt(10)=='A'|| text.charAt(49)=='A'|| text.charAt(50)=='A'
}

private setBackground(String text) {
  if (shouldSetBackgroundLedverte(text)) {
    ledGeneral.setBackgroundResource(R.drawable.ledverte);
  } else if (shouldSetBackgroundLedgeneralrouge(text)) {
    ledGeneral.setBackgroundResource(R.drawable.ledgeneralrouge);
  } else {
    ledGeneral.setBackgroundResource(R.drawable.imageverte);
  }
}

相关问题