为何数组列表存在重复元素时我的代码有时不返回true?
排查生日列表重复判断代码的问题
我正在完成一项编程作业,需求是判断给定的、用整数存储日期的生日列表是否存在重复,返回布尔值。我写了几种不同的方法来实现,但部分方法有时候没法正常工作,我不知道问题出在哪。希望有人能帮我排查问题,或者确认是不是我用的编程平台有bug。谢谢!
我的代码如下:
birthdays = merge(birthdays);//this is a merge sort that sorts the ArrayList(it does actually work) for(int i = 0; i<birthdays.size()-1; i++) { if(birthdays.get(i) == birthdays.get(i+1)) { return true; } } return false;
可能的问题排查点:
==比较的坑:如果你的birthdays是ArrayList<Integer>(包装类),用==比较两个元素会出问题。因为Integer是对象,==对比的是对象引用而非实际数值。当整数超出-128到127的范围时,自动装箱生成的是不同的对象,哪怕数值相同,==也会返回false,导致漏判重复。建议换成birthdays.get(i).equals(birthdays.get(i+1)),或者拆箱成基本类型比较:birthdays.get(i).intValue() == birthdays.get(i+1).intValue()。- 排序逻辑的隐性问题:虽然你说
merge排序能工作,但可以手动验证几个测试用例,比如包含重复元素的列表排序后,重复项是否真的相邻。比如输入[20230101, 20221231, 20230101],排序后应该是[20221231, 20230101, 20230101],如果排序结果不符合,那就是排序函数的问题。 - 边界测试用例:检查空列表、单元素列表、所有元素都重复的列表这些极端情况,看代码是否能正确返回结果。比如空列表应该返回false,全重复列表应该返回true。
先优先排查上面的代码问题,尤其是==的使用,这是Java包装类比较的常见错误。如果修正后还是出现异常,再考虑是否是编程平台的bug。
内容的提问来源于stack exchange,提问作者YungSaucer406
相关产品推荐
相关产品推荐

