You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:40:26