有没有一种简单的方法来编码多条条件?

时间:2014-06-04 15:40:16

标签: java

我在Java中有下面的代码。我需要执行所有的if语句。有一个更好的方法来编写这个。在每个语句中,我都会进行数据库调用。

if (!keyAccntId.equalsIgnoreCase("-1") && !(segmentId.equalsIgnoreCase("-1")) && !(regionId.equalsIgnoreCase("-1"))) {
    templateOrder.add("1");
}
if (!keyAccntId.equalsIgnoreCase("-1") && (segmentId.equalsIgnoreCase("-1")) && !(regionId.equalsIgnoreCase("-1"))) {
    templateOrder.add("2");
}
if (!keyAccntId.equalsIgnoreCase("-1") && (segmentId.equalsIgnoreCase("-1")) && (regionId.equalsIgnoreCase("-1"))) {
    templateOrder.add("3");
}
if (keyAccntId.equalsIgnoreCase("-1") && !(segmentId.equalsIgnoreCase("-1")) && !(regionId.equalsIgnoreCase("-1"))) {
    templateOrder.add("4");
}
if (keyAccntId.equalsIgnoreCase("-1") && (segmentId.equalsIgnoreCase("-1")) && !(regionId.equalsIgnoreCase("-1"))) {
    templateOrder.add("5");
}
if (keyAccntId.equalsIgnoreCase("-1") && (segmentId.equalsIgnoreCase("-1")) && (regionId.equalsIgnoreCase("-1"))) {
    templateOrder.add("6");
}

5 个答案:

答案 0 :(得分:16)

您可以创建一个位掩码并启用它:

public static final int KEY = 1;
public static final int SEGMENT = 2;
public static final int REGION = 4;

int value = 0;

if (keyAccntId.equalsIgnoreCase("-1")) {
    value += KEY;
}
if (segmentId.equalsIgnoreCase("-1")) {
    value += SEGMENT;
}
if (regionId.equalsIgnoreCase("-1")) {
    value += REGION;
}

它为您提供了8个可能的值,您可以打开它们:

switch(value) {
case 0:
    // All false
    break;
case KEY:
    // only keyAccntId is true
    break;
case REGION:
    // only segmentId is true
    break;
case KEY + REGION:
    // segmentId and keyAccntId are true
    break;
// So on
}

修改

添加常量以提高可读性

答案 1 :(得分:7)

@ njzk2使用Java 7的答案的缩短版本。

public static final int KEY = 0b001, SEGMENT = 0b010, REGION = 0b100;

int comb = (keyAccntId.equals("-1") ? KEY : 0) +
        (segmentId.equals("-1") ? SEGMENT : 0) +
        (regionId.equals("-1") ? REGION : 0);
switch(comb) {
     case 0:       /* none are true. */ break;
     case REGION:  /* only regionId is -1 */ break;
     // more combinations.
     case KEY + SEGMENT + REGION: /* all are -1 */ break;
}

答案 2 :(得分:2)

否“如果”,否则“切换”。这3行将涵盖您的所有情况:

 int val = keyAccntId.equals("-1")? 3:0;
 val += ((segmentId.equals("-1")? 1:0) + (regionId.equals("-1")? 1:0);
 templateOrder.add(val+1+"");

您可能希望封装代码,因此最终会出现类似这样的内容:

public int getTemplateOrder(int keyAccntId, int segmentId, int regionId){
  int val = keyAccntId.equals("-1")? 3:0;
  return val + (segmentId.equals("-1")? 1:0) + (regionId.equals("-1")? 1:0) + 1;
}

//Usage
templateOrder.add(getTemplateOrder(keyAccntId, segmentId, regionId)+"");

为了便于阅读,这些是3行:

   int acc = keyAccntId.equals("-1")? 3:0;
   int seg = segmentId.equals("-1")? 1:0;
   int reg = regionId.equals("-1")? 1:0;
   int val = acc;

   //Construct the value currently being used on each If statement.
   val += seg + reg;

   //You've got the value, so instead of If/switch, just set it.
   templateOrder.add(val+1+"");

我希望它不会太模糊。

问候。

答案 3 :(得分:0)

为了让视觉上更容易,你可以做这样的事情......

boolean keyTF = keyAccntId.equalsIgnoreCase("-1"), 
segmentTF = segmentId.equalsIgnoreCase("-1"), 
regionTF = regionId.equalsIgnoreCase("-1");

if (!keyTF  && !segmentTF  && !regionTF ) {
    templateOrder.add("1");
}
if (!keyTF  && segmentTF  && !regionTF ) {
    templateOrder.add("2");
}
if (!keyTF  && segmentTF  && regionTF ) {
    templateOrder.add("3");
}
if (keyTF  && !segmentTF  && !regionTF ) {
    templateOrder.add("4");
}
if (keyTF  && segmentTF  && !regionTF ) {
    templateOrder.add("5");
}
if (keyTF  && segmentTF  && regionTF ) {
    templateOrder.add("6");
}

但问题是你正在处理逻辑真值表,而你只需要逐步完成所有可能性。由于您正在使用3个单独的变量,因此无法再进一步压缩代码

FFF
FTF
FTT
TFF
TTF
TTT

你实际上错过了TFT案例:)

答案 4 :(得分:0)

只有六种可能的组合会导致调用add方法。

我们注意到add方法只在OP代码中调用一次,因为if语句中的条件是互斥的...如果其中一个的计算结果为TRUE,则其他的将返回FALSE。 / p>

带着逻辑真值表去老学校:

keyAccntId.equalsIgnoreCase("-1") |       F       |       T       |
segmentId.equalsIgnoreCase("-1")  |   F   |   T   |   F   |   T   |
regionId.equalsIgnoreCase("-1")   | F | T | F | T | F | T | F | T |
----------------------------------+---+---+---+---+---+---+---+---+
templateOrder.add("1");           | y | - | - | - | - | - | - | - |
templateOrder.add("2");           | - | - | y | - | - | - | - | - |
templateOrder.add("3");           | - | - | - | y | - | - | - | - |
templateOrder.add("4");           | - | - | - | - | y | - | - | - |
templateOrder.add("5");           | - | - | - | - | - | - | y | - |
templateOrder.add("6");           | - | - | - | - | - | - | - | y |
----------------------------------+---+---+---+---+---+---+---+---+

如果得到的值是"排队"如果条件更好,那么你可以减少比较的次数。

int n = 0;
if (keyAccntId.equalsIgnoreCase("-1") {
  n += 4;
} 
if (segmentId.equalsIgnoreCase("-1") {
  n += 2;
}  
if (regionId.equalsIgnoreCase("-1") {
  n += 1;
}
templateOrder.add(String.valueOf(n));

注意:上面的代码不等同于OP代码。为了使其执行等效,我们需要添加条件测试,以便在n为1或5时不调用add方法,并转换n的值到指定的字符串参数值:

n    arg
---  ----
0    "1"
1    - 
2    "2"
3    "3"
4    "4"
5    -
6    "5"
7    "6"

逻辑表看起来像这样:

keyAccntId.equalsIgnoreCase("-1") |       F       |       T       |
segmentId.equalsIgnoreCase("-1")  |   F   |   T   |   F   |   T   |
regionId.equalsIgnoreCase("-1")   | F | T | F | T | F | T | F | T |
----------------------------------+---+---+---+---+---+---+---+---+
n += 4;                           | - | - | - | - | y | y | y | y |
n += 2;                           | - | - | y | y | - | - | y | y |
n += 1;                           | - | y | - | y | - | y | - | y |
templateOrder.add(arg);           | y | - | y | y | y | - | y | y |
----------------------------------+---+---+---+---+---+---+---+---+