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

Java遍历存储City对象的ArrayList求和、取最大值异常修复

问题说明

现有存储自定义类City实例的ArrayList集合cities,每个City实例包含城市名称、人口两个属性,需要实现两个核心功能:

  1. 累加所有城市人口计算国家总人口
  2. 查找集合中人口数量最高的城市
    当前代码存在运行异常、逻辑错误,无法得到正确结果。

现存代码问题
  • 总人口计算逻辑错误:getTotalPop方法中直接将City对象拼接到字符串,iter.next()返回的是City实例而非人口属性值,默认拼接后得到的是对象内存地址字符串,完全不符合数字格式,因此Long.parseLong会抛出数字格式异常;同时循环第一次执行就触发return,未完成全量遍历累加,初始字符串为null还会导致拼接结果带无效前缀。
  • 最大城市查询逻辑错误:getLargest方法中if判断写为city.getPop()>city.getPop(),是对象自身和自身比较,结果永远为false;没有维护遍历过程中的最大人口基准值,且循环内直接return会提前终止遍历,无法得到全局最大值。
  • 基础语法拼写错误:Country构造方法参数类型写为Cidade,与实际类名City不符;City类双参构造方法中赋值写为this.name = nome,nome为未定义变量,会直接编译报错。

修正后完整代码

City类修正

public class City {
    private String name;
    private int pop;

    public City(String name) {
        this.name = name;
    }

    public City(String name, int pop) {
        // 修正拼写错误,将未定义的nome改为传入的参数name
        this.name = name;
        this.pop = pop;
    }

    public String getName() {
        return name;
    }

    public int getPop() {
        return pop;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPop(int pop) {
        this.pop = pop;
    }
    
}

Country类修正

import java.util.ArrayList;
import java.util.Iterator;

public class Country {
    private String name;
    private City capital;
    private int pop;
    private ArrayList<City> cities;

    // 修正参数类型拼写错误,将不存在的Cidade类改为City
    public Country(String name, City capital, int pop) {
        this.name = name;
        this.capital = capital;
        this.pop = pop;
        cities = new ArrayList<>();
        cities.add(capital);
    }

    public long getTotalPop(){
        // 直接用long类型存储总人口,完全不需要做字符串转换
        long totalPop = 0;
        Iterator<City> iter = cities.iterator();
        while(iter.hasNext()){
            City currentCity = iter.next();
            // 调用getPop方法获取当前城市的人口属性值做累加
            totalPop += currentCity.getPop();
        }
        // 遍历完所有城市后再返回最终累加结果
        return totalPop;
    }
    
    public City getLargest(){
        if (cities.isEmpty()) {
            return null;
        }
        // 取第一个城市作为初始比较基准,存储当前遍历到的最大城市
        City largestCity = cities.get(0);
        for(City city: cities){
            // 用当前遍历城市的人口和基准最大城市的人口比较
            if(city.getPop() > largestCity.getPop()){
                // 人口更大则更新基准值
                largestCity = city;
            }
        }
        // 全量遍历完成后返回全局最大城市
        return largestCity;
    }
    
}

逻辑说明
  • 访问集合中存储对象的属性,必须先拿到对象实例,再调用对象提供的getter方法获取对应属性,不能直接把对象转成字符串做数值解析。
  • 做累加、求极值这类聚合操作,必须遍历完集合内所有元素再返回结果,不能在循环第一次执行就return。
  • 求极值需要提前定义一个存储临时最大值的变量,每次遍历用当前元素和临时最大值比较,符合条件就更新临时变量,遍历结束后临时变量就是全局最大值。

内容的提问来源于stack exchange,提问作者nuno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:45:42