List中AccountInfo对象电话号码全同校验异常:始终返回true问题排查求助
问题分析与修复方案
首先看你代码里的isSamePhoneNumber方法,有几个关键问题导致它总是返回true:
1. 标志位逻辑错误
你初始化isSamePhoneNumberFlag为false,但只要找到任意一对相同的号码,就把标志位设为true,之后哪怕遇到不同的号码,也不会把标志位改回false。这就导致只要列表里有至少两个相同号码,最终就会返回true,完全忽略了“所有号码必须相同”的要求。
2. 字符串比较错误
你用了==来比较电话号码字符串,这是在比较对象的引用地址,而不是字符串的实际内容。虽然字符串字面量会存在常量池里,有时候引用会相同,但这是不可靠的(比如如果号码是动态生成的或者从外部输入的,==就会失效),正确的做法是用equals()方法比较内容。
3. 循环比较逻辑错误
你的内层循环是j从i+1开始,但实际比较的却是accountInfoList.get(i)和accountInfoList.get(i+1),完全没用到j。这不仅逻辑混乱,还会导致重复比较,甚至可能在某些情况下出现索引越界风险。
修复后的方法实现
我们可以换一种更简洁、逻辑正确的思路:
- 如果列表为空或者只有一个元素,直接返回
true(没有不同的号码) - 取第一个元素的电话号码作为基准
- 遍历列表中剩下的所有元素,只要有一个元素的号码和基准不同,立刻返回
false - 如果遍历完所有元素都和基准相同,返回
true
修复后的代码:
public static boolean isSamePhoneNumber(List<AccountInfo> accountInfoList){ // 空列表或单个元素直接返回true if(accountInfoList == null || accountInfoList.size() <= 1){ return true; } // 取第一个元素的号码作为基准 String basePhone = accountInfoList.get(0).getPhoneNumber(); // 遍历剩下的元素 for(int i = 1; i < accountInfoList.size(); i++){ String currentPhone = accountInfoList.get(i).getPhoneNumber(); // 用Objects.equals处理可能的null情况,避免空指针 if(!Objects.equals(basePhone, currentPhone)){ return false; } } return true; }
另外,你主方法里的变量传递可以更清晰一点,直接使用populateList返回的列表调用校验方法,不过当前写法逻辑上没问题。
测试结果
用你的测试数据运行修复后的代码,会输出:
[AccountInfo{accountName='Rohit Sharma', phoneNumber='123456'}, AccountInfo{accountName='Mayank Singh', phoneNumber='123456'}, AccountInfo{accountName='Sam Singh', phoneNumber='12378456'}, AccountInfo{accountName='Rahul Sharma', phoneNumber='123456'}] Some of the phone numbers are different
这就完全符合需求了。
内容的提问来源于stack exchange,提问作者Rohit Sharma
相关产品推荐
相关产品推荐

