Java遍历存储City对象的ArrayList求和、取最大值异常修复
问题说明
现有存储自定义类City实例的ArrayList集合cities,每个City实例包含城市名称、人口两个属性,需要实现两个核心功能:
- 累加所有城市人口计算国家总人口
- 查找集合中人口数量最高的城市
当前代码存在运行异常、逻辑错误,无法得到正确结果。
现存代码问题
- 总人口计算逻辑错误:
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
相关产品推荐
相关产品推荐

