2014-02-19 286 views
-1

我有一个具有四个字段简化的Java IF或CASE语句

<field1> 
<field2> 
<field3> 
<field4> 

这些字段的值可以为TRUE或FALSE的XML文件。我想要确定输出是A,B,C还是D.为此,我必须查看这四个字段,每个组合都意味着输出是A,B,C或D.可能的组合和输出如下所述:

1T, 2F, 3F, 4F; A 
1T, 2T, 3F, 4F; B 
1T, 2T, 3T, 4F; C 
1T, 2T, 3T, 4T; C 
1T, 2F, 3T, 4F; A 
1T, 2F, 3T, 4T; A 
1T, 2F, 3F, 4T; A 
1T, 2T, 3F, 4T; B 

的数字表示场号和字符中的数字表示的值是否是真还是假,例如,第一组合(-1T, 2F, 3F, 4F; A)是说如果FIELD1是TRUE后,FIELD2是假,field3为false,则输出为A. 如果不匹配,则输出为D.

很明显,我可以这样做

if(field1, !field2, !field3, !field4) 
return 'A' 
else if(field1, field2, !field3, !field4) 
return 'B' 
else if(field1, field2, field3, !field4) 
return 'C' 
... 
.... 
.... 
and so on 

需要注意的是,其中一些领域可以为空(即标签可能不存在)。缺少100条IF语句,是否有更简单的方法来编码这些组合?

在此先感谢

+3

http://en.wikipedia.org/wiki/Karnaugh_map –

+0

集团它们,例如字段1总是必须是真实的(从我能收集的内容中),所以只需将其余的if包括在内以便检查。然后你可以用类似的方式做其他3个 – RyanS

+0

你是否错过了一些可能的输出,或者将值1永远为真? – thegrinner

回答

4

有个叫这是简化的那种逻辑的具体使用Karnaugh map工具。

已经过去了五年,因为我不得不触摸一个,但如果您搜索它,那么关于这个主题的信息有很多。


而且这不是唯一的方法,如果你想获得创意。

您可以收集您的字段到一个单一的价值和使用地图,(Actual map syntax here

myMap["TFTF"] = 'A' 

,我敢肯定,你可以找到其他创造性的方法一样,如果你认为这个问题更

1

我会去为这种事情,如下(伪代码):

int c=0; 
array r[4]= [field1, field2, field3, field4]; 

for(int i=0; i<4; i++) { 

    if (!r[i]) break; 

    c++; 
} 

return 'A'+c; 

根据您想如何处理空,你傻添加一个测试,如果(R [i]为NUL l){}

2

您可以将数值以某种方式编码为一个数字,以便每个组合都给出一个数字,而不是其他任何组合的数字。

该编码可能只是二进制。

1000=8 A 
1100=12 B 
1110=14 C 
1111=16 C 
1010=10 A 
1011=11 A 
1001=9 A 
1101=13 B 

然后,您需要像地图这样的数据结构来将每个数字与输出关联起来。

编辑:我说了一个数字,但实际上任何编码都可以工作,地图几乎允许任何东西作为关键。其他编码:"TFFF", "1000", "1T 2F 3F 4F", Arrays.asList(true, false, false, false) ...

1

您可以用查找表简化事情:

table[1][0][0][0] = 'A' 
table[1][1][0][0] = 'B' 
table[1][1][1][0] = 'C' 
table[1][1][1][1] = 'C' 
table[1][0][1][0] = 'A' 
table[1][0][1][1] = 'A' 
table[1][0][0][1] = 'A' 
table[1][1][0][1] = 'B' 

做一个函数把现场变成1或0再插那些表,并得到你的答案。

1

通过图案的外观上来看,如果我们只是在使用的数据集,我们可以简单地做测试:

if (field3 && field2) 
    return 'C'; 
else if (!field3 && field2) 
    return 'B'; 
else 
    return 'A'; 
+1

'if(field3 && field2)'这已经不是真的,因为例如: 'FTTT'将会是'D' –

+0

我在我对数据集的回答中说过,我们在问题中看到。我不知道会不会有一个D,因为我只看到这8个领域。 – Hayden

2

根据表如何“密集”是,你可能只是想治疗字段为二进制数字,构造相应的号码,然后做一个阵列查找:

234 
0 000: A 
1 001: A 
2 010: A 
3 011: A 
4 100: B 
5 101: B 
6 110: C 
7 111: C 

int x = (field2 ? 4 : 0) + (field3 ? 2 : 0) + (field4 ? 1 : 0) 
return "AAAABBCC".charAt(x); 

对于例如,这将只是工作顺便说一句(field4中和1是不相关的输出):

return field2 ? (field3 ? 'C' : 'B') : 'A' 
1

好的,所以首先你需要安全地处理空值。你可以写为此两种方法:

boolean safeTrue(Boolean b){ 
    return b != null && b.booleanValue(); 
} 

boolean safeFalse(Boolean b){ 
    return b != null && !(b.booleanValue()); 
} 

之后,你确实可以通过使用卡诺图减少你的布尔表达式,如一些其他研究员这里建议。其结果将是:

if(safeTrue(field1) && safeFalse(field2)){ 
    return 'A'; 
} 
if(safeTrue(field1) && safeTrue(field2) && safeFalse(field3)){ 
    return 'B'; 
} 
if(safeTrue(field1) && safeTrue(field2) && safeTrue(field3)){ 
    return 'C'; 
} 
//finally, return some value for the case when no combiantion has been matched. 
1

如果你读它这种方式,并表示它的二进制是:

1T, 2F, 3F, 4F; A 1000 (8) 
1T, 2F, 3F, 4T; A 1001 (9) 
1T, 2F, 3T, 4F; A 1010 (10) 
1T, 2F, 3T, 4T; A 1011 (11) 
1T, 2T, 3F, 4F; B 1100 (12) 
1T, 2T, 3F, 4T; B 1101 (13) 
1T, 2T, 3T, 4F; C 1110 (14) 
1T, 2T, 3T, 4T; C 1111 (15) 

所以:

if binaryRepr>=8 && binaryRepr<=11 then A 
if binaryRepr>=12 && bicnaryRepr<=13 then B 
if binaryRepr>=14 then C 
else D 
1

根据输入和输出的列表,你只需要field2field3。然后,我建议如下:

if (!field2) 
    return 'A'; 
else if (field3) 
    return 'C'; 
else 
    return 'B'; 

这种解决方案的if之前,你应该应对可能出现的null值。你上市

1

鉴于情况下,第一和第四场是不相关的,所有你需要的是这样的:

char foo(boolean field2, boolean field3) 
{ 
    return field2 ? (field3 ? 'C' : 'B') : 'A'; 
}