Java中ArrayList<Double>的allSame函数实现问题求助
解决ArrayList allSame函数的问题
嘿,我来帮你捋清楚这个问题!你遇到的报错和逻辑问题其实都是ArrayList和数组的使用差异,还有判断逻辑搞反了,咱们一步步来修:
1. 先解决报错:找不到length()方法
ArrayList不是原生数组,它是Java集合框架里的类,所以:
- 不能用数组的
length属性(你写的length()方法更是错的,数组根本没有这个方法),要获取ArrayList的元素个数得用size()方法 - 不能用
s[i]这种数组下标语法访问元素,得调用get(i)方法来获取指定索引的元素
2. 修正逻辑错误
你的当前逻辑完全反了:现在是只要找到一对相等的元素就返回true,但我们需要的是所有元素都相同,所以应该是:
- 遍历的时候,只要发现有一个元素和基准元素不相等,直接返回false
- 等遍历完所有元素都没发现不同的,再返回true
- 还要处理边界情况:如果列表是空的,或者只有一个元素,那默认所有元素(其实没有/只有一个)都是相同的,应该返回true
3. 注意Double包装类的比较
Double是引用类型,用==比较的是对象的内存地址,不是实际的数值!所以应该用equals()方法来比较值是否相等(如果不需要考虑NaN的特殊情况,这个方法就够用)
修正后的完整代码
public boolean allSame(ArrayList<Double> s) { // 处理空列表或单个元素的边界情况 if (s.size() <= 1) { return true; } // 拿第一个元素作为基准 Double firstElement = s.get(0); // 从第二个元素开始逐个比较 for (int i = 1; i < s.size(); i++) { if (!firstElement.equals(s.get(i))) { // 发现不同元素,直接返回false return false; } } // 所有元素都和基准相同,返回true return true; }
如果更倾向于你最初的相邻元素比较思路,也可以这么写:
public boolean allSame(ArrayList<Double> s) { if (s.size() <= 1) { return true; } // 循环到倒数第二个元素就停止,避免i+1越界 for (int i = 0; i < s.size() - 1; i++) { if (!s.get(i).equals(s.get(i + 1))) { return false; } } return true; }
额外说明
如果你的场景中可能出现NaN(因为Double.NaN不等于任何值,包括它自己),那用equals()会把NaN当成不同的元素。如果需要把NaN视为相同的,可以用Double.compare()方法替代:
if (Double.compare(s.get(i), s.get(i+1)) != 0) { return false; }
内容的提问来源于stack exchange,提问作者Aims.kar
相关产品推荐
相关产品推荐

