首页 新闻 会员 周边 捐助

if判断语句效率问题

0
悬赏园豆:20 [已解决问题] 解决于 2015-10-14 09:33

a  b  c  d都是字符串

第一种  if(!(a.equals(b) && c.equals(d) && e.equals(f)))

第二种  if(!a.equals(b) || !c.equals(d) || !e.equals(f))

 

请问哪种方式效率上高一点?哪一种编程更规范点?

犯犯的主页 犯犯 | 初学一级 | 园豆:184
提问于:2015-10-13 14:46
< >
分享
最佳答案
0

从逻辑上讲,只要ab,cd,ef有一组不相等,就返回真。

从圈复杂度上讲:这么一句代码的圈都超过4。

从可读性上讲:难以阅读。第二种相对要好些。

从效率上讲:都有机会短路,效率与数据相关。

Boolean isAnyStringNotEqual = !a.equal(b) || !c.equal(d) || !e.equal(f);

if(isAnyStringNotEqual){
  //Do something....
}

//如上方案没有降低圈复杂度,但是提高了可读性。

//如下为C#代码
bool isAnyStringNotEqual = string.Format("{0}||{1}||{2}", a, c, e) ==  string.Format("{0}||{1}||{2}", b, d, f)

通过插入判定符,先拼接字符串再比较,达到减少复杂度的效果。

 

收获园豆:20
幻天芒 | 高人七级 |园豆:37205 | 2015-10-14 09:16
其他回答(2)
0

你这2中实现的都是不一样的需求,怎么比较,其实都不好

稳稳的河 | 园豆:4216 (老鸟四级) | 2015-10-13 14:50

为什么不一样?新手不懂

支持(0) 反对(0) 犯犯 | 园豆:184 (初学一级) | 2015-10-13 15:03

@犯犯: 我说的不好是,很多团队这样写,代码复杂度太高,!(a.equals(b) && c.equals(d) && e.equals(f))是啊a!=b,c!=d,e!=f同时成立,下面是||只要一个成立

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-10-13 15:09

@稳稳的河: 你朋友说的是|,不是||,||不会短路的,效率一样

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-10-13 15:17

@稳稳的河: 你确定没说反?

支持(0) 反对(0) 犯犯 | 园豆:184 (初学一级) | 2015-10-13 15:36

@犯犯: 什么说反了了,|只要你正确后面就不要判断了

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-10-13 15:39

@稳稳的河: ||才是短路或呀,|是位运算吧

支持(0) 反对(0) 犯犯 | 园豆:184 (初学一级) | 2015-10-13 15:39

@犯犯: 我刚测试了下,很久没有用了,搞错了,不过第2点回复也没错

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-10-13 15:54

@稳稳的河: 恩恩,你觉得这两个判断一样吗

支持(0) 反对(0) 犯犯 | 园豆:184 (初学一级) | 2015-10-13 15:56

@犯犯: if(!(a.equals(b) && c.equals(d) && e.equals(f)))不成立的时候是a==b,c==d,e==f,if(!a.equals(b) || !c.equals(d) || !e.equals(f))不成立的条件也是a==b,c==d,e==f,是一样的,我开始看错短路了

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-10-13 16:03

@稳稳的河: 是这样的,又回到我问题的出发点了。。

支持(0) 反对(0) 犯犯 | 园豆:184 (初学一级) | 2015-10-13 16:05

@犯犯: 这个是一样的,短路都是一起短路

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-10-13 16:16
0

你这两个判断根本就不是一样的..

 

不好意思. 仔细看了下. 应该是相等的.

第一种写法很容易让人不小心看成 if(!a.equals(b) && !c.equals(d) && !e.equals(f)) 

个人觉得第二种好. 其实这个效率影响不大的. 最重要是可读性.

李丶GuanYao | 园豆:1228 (小虾三级) | 2015-10-13 15:27

怎么不一样了

支持(0) 反对(0) 犯犯 | 园豆:184 (初学一级) | 2015-10-13 15:36

@犯犯: 效果完全不一样,第一种是非满足所有的条件,第二种非满足任何一个条件。产生的效果完全不一样。

支持(0) 反对(0) ````` | 园豆:14268 (专家六级) | 2015-10-13 15:38

@`````: 不都是只要三个条件有一个不等就可以了吗?想不通。。。

支持(0) 反对(0) 犯犯 | 园豆:184 (初学一级) | 2015-10-13 15:43

@犯犯: 你把&& 读成并且  把|| 读成或者 ,然后再试试?

if(!(a.equals(b) && c.equals(d) && e.equals(f)))  =   if(!a.equals(b) && !c.equals(d) && !e.equals(f)) !=  if(!a.equals(b) || !c.equals(d) || !e.equals(f))

 if(!a.equals(b) || !c.equals(d) || !e.equals(f))  == if(!(a.equals(b)) || !(c.equals(d)) || !(e.equals(f)))

支持(0) 反对(0) ````` | 园豆:14268 (专家六级) | 2015-10-13 15:47

@`````: if(!(a.equals(b) && c.equals(d) && e.equals(f)))  =   if(!a.equals(b) && !c.equals(d) && !e.equals(f)) 这两个不等吧, 后面也就不对了吧

支持(0) 反对(0) 犯犯 | 园豆:184 (初学一级) | 2015-10-13 15:53

@犯犯: 不好意思. 仔细看了下. 应该是相等的.

第一种写法很容易给人误导成 if(!a.equals(b) && !c.equals(d) && !e.equals(f)) 

个人觉得第二种好. 其实这个效率影响不大的. 最重要是可读性.

支持(0) 反对(0) 李丶GuanYao | 园豆:1228 (小虾三级) | 2015-10-13 15:58

@犯犯: 如果非(a =b 并且 c = d 并且 e = f )

 =  如果a不等于b 并且 c 不等于d 并且 e不等于f.

这个确定不等?

支持(0) 反对(0) ````` | 园豆:14268 (专家六级) | 2015-10-13 15:59

@`````: 

我一开始也误解成这个.  其实认真看起来. 非 (a =b 并且 c = d 并且 e = f ). 如果其中一个是false. 那么括号里面的结果就是false. 然后加个非就是true了. 

所以并不是a!=b,b!=c,c!=d,d!=f

支持(0) 反对(0) 李丶GuanYao | 园豆:1228 (小虾三级) | 2015-10-13 16:03

@`````: 真的不等,我在eclipse上刚刚跑了一下

支持(0) 反对(0) 犯犯 | 园豆:184 (初学一级) | 2015-10-13 16:03

@李丶GuanYao: 是这个道理,看来第一种还真的很容易让人误解啊,看来真的是第二种好点

支持(0) 反对(0) 犯犯 | 园豆:184 (初学一级) | 2015-10-13 16:09

@李丶GuanYao: 嗯嗯 是的。这个我也想错了。是这样的,忘记了这个条件其实是一个整体了。是的,这点我错了。

支持(0) 反对(0) ````` | 园豆:14268 (专家六级) | 2015-10-13 16:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册