判断List是否存在相同的元素
程序员文章站
2022-06-10 20:50:09
...
1 问题
- 感觉一个很简单的逻辑,但却写了很久,一版一版地改
2 最终版
- Groovy的写法
boolean hasCommonItem(List<String> list1, List<String list2){
if(!list1 && !list2){
return true
}else if(!list1 || !list2){
return false
}
return !Collections.disjoint(list1,list2)
}
3 反思
整个过程
-
一开始使用 list1-list2 , 通过数量的变化来判断是否有共同元素,但增加了一大堆的空值判断(null,与[])
-
业务上,如果两个集合都为空(null, []), 也认为他们包含相同元素,不允许同时存在
-
感觉逻辑很复杂之后,我直接换了一个方向,使用Map,key不能重复判断,是否存在相同元素
-
刚开始写完沾沾自喜,觉得写得不错,但慢慢又加上了对两个List的空值判断
-
觉得没有思路之后,百度了一下,发现了Collections.disjoint
-
写完又觉得发现新大陆,但后面又加上了的空值判断
-
逻辑判断这一块比较弱,需要加强,中间list2报null错,竟然
if(!list1 && !list2) {
}
改为了
if(!list1){
if(!list2){
}
//这里写判断,list1非空的情况下,是不是进来的
}
感觉思考会在有些时刻,完全没有根据,任凭感觉就做出了判断,这里是个大问题
- 两个非空的判断,也在纠结
- 一开始写了两者均为空值的情况,if(!list1 && !list2)
- 但只想判断list2为空就不知道写哪里了,因为看到if(!list1 && !list2)不知道该写在里面还是外面,也不知道写什么
- 想的是 list2为空与上面的判断有什么关系,现在都有些不清楚
- 回过头来,写法增加了认知难度, if(!list) 其实表示:如果list为空值
- if(!list1 && !list2) 表示:如果list1与list2都为空
- 翻译为中文后,就比较好理解了, 第一行是两个都为空,第二行可以写 else if(!list1)为空, 这个时候,进来的list2不为空, 第三行写else if(!list2), 这个时候进来的list1不为空,到这里已经排除了所有可能为null的地方
- 只要一个为空,就一定没有共同元素,逻辑就改为了
if(!list1 && list2){
return true
}else if(!list1 || !list2){
return false
}
总结
- 中文的翻译:如果对象为空值: if(!obj)
- 当空值判断干扰了你的逻辑,把为空的情况剥离出来
- 交织的逻辑判断,会急剧增加复杂度,先写明白(思考的时候,还是要加强剥离多个因素的意识)
- 这不是可阅读的状态,不能体现在编码中,编码最优解就是拆分出独立逻辑
上一篇: linux线程同步的方法
下一篇: 静态代理&动态代理