Java代码求助:ArrayList无法正确获取元素的最小/最大值
Java代码问题排查:无法正确获取ArrayList元素的最小值和最大值
问题描述
尝试从ArrayList中获取元素的最小和最大值,但程序仅输出列表中第一个添加的元素与最后一个添加的元素。
代码示例
import java.util.ArrayList; //import java.util.Collections; public class ClassName{ private String fieldName; private ArrayList<SubClass> list = new ArrayList<>(); public ClassName(String a) { fieldName = a; } public String getFieldName() { return fieldName; } public void addSub(SubClass b) { list.add(b); } public void addSub(String b, double c) { list.add(new SubClass(b, c)); } public boolean haveSub(String b, double c) { return list.contains(new SubClass(b, c)); } public SubClass getSubByName(String b) { String d = b; for (Sub elem : list) { d += elem; return elem; } return null; } public SubClass closest() { SubClass min = list.get(0); for (int i = 1; i > list.size(); i++) { SubClass minC = list.get(i); if (min.equals(minC)) { min = list.get(i); } } return min; } public SubClass furthest() { SubClass max = list.get(0); for (int i = 0; i < list.size(); i++) { Planet maxC = list.get(i); if (max.equals(maxC)) { max = list.get(i); } } return max; } @Override public String toString() { String s = "...text..." + fieldName + " ...text...:\n"; for (SubClass elem : list){ s += elem.toString(); } return s; } }
错误分析及修复方案
closest()方法的循环条件错误
当前循环条件是i > list.size(),这会导致循环根本不会执行(初始i=1,而list.size()至少为1,1>1不成立),直接返回第一个元素list.get(0)。
修复:将循环条件改为i < list.size()。比较逻辑错误(
equals()方法误用)
不管是closest()还是furthest(),都用min.equals(minC)或max.equals(maxC)判断,这仅比较对象是否相等,而非数值大小(比如你要比较的double c字段)。
修复:根据SubClass中的数值字段(如c)进行大小比较。假设SubClass有getValue()方法返回该double值,代码应改为:
// closest()中的比较逻辑 if (minC.getValue() < min.getValue()) { min = minC; } // furthest()中的比较逻辑 if (maxC.getValue() > max.getValue()) { max = maxC; }
furthest()方法中的类型错误
代码中写Planet maxC = list.get(i);,但列表存储的是SubClass类型,类型不匹配会导致编译错误。
修复:将Planet改为SubClass。getSubByName()方法逻辑错误
该方法在循环第一次迭代就直接返回elem,未根据传入的b参数匹配名称,无法正确按名称查找元素。
修复:判断每个元素的名称是否等于b,找到后再返回:
public SubClass getSubByName(String b) { for (SubClass elem : list) { // 假设SubClass有getName()方法返回名称字段 if (elem.getName().equals(b)) { return elem; } } return null; }
haveSub()方法的潜在问题list.contains(new SubClass(b, c))依赖SubClass正确重写equals()和hashCode()方法,否则会因对象引用不同返回false。
建议:在SubClass中基于b和c字段重写equals()和hashCode()。
修复后的关键方法示例
public SubClass closest() { if (list.isEmpty()) { return null; // 处理空列表,避免索引越界 } SubClass min = list.get(0); for (int i = 1; i < list.size(); i++) { SubClass minC = list.get(i); // 假设SubClass有getDistance()方法返回要比较的double值 if (minC.getDistance() < min.getDistance()) { min = minC; } } return min; } public SubClass furthest() { if (list.isEmpty()) { return null; } SubClass max = list.get(0); for (int i = 1; i < list.size(); i++) { SubClass maxC = list.get(i); if (maxC.getDistance() > max.getDistance()) { max = maxC; } } return max; }
内容的提问来源于stack exchange,提问作者ennie Ayeni
相关产品推荐
相关产品推荐

