判断List是否存在相同的元素

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)
  • 当空值判断干扰了你的逻辑,把为空的情况剥离出来
  • 交织的逻辑判断,会急剧增加复杂度,先写明白(思考的时候,还是要加强剥离多个因素的意识)
  • 这不是可阅读的状态,不能体现在编码中,编码最优解就是拆分出独立逻辑
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值