Java中计算含Integer实例字段的两个对象ArrayList差值问题
问题:计算对象年龄差值时结果错误,无法获取正确最小差值
以下是出现问题的Java代码:
package pckg; import java.util.ArrayList; import java.util.HashMap; public class Tester { public static void main(String[] args) { ArrayList<TesterObj> my_first_objects = new ArrayList<TesterObj>(); TesterObj one = new TesterObj(5,"john",6.8,"HELKEOLOSSJK NHSSB BSBSJBS NS S"); TesterObj two = new TesterObj(25,"eric",12.32,"SKSMK skm1d dms dnms kmdks"); TesterObj three = new TesterObj(15,"sally",2.40,"dskmdnk kmdk kwmd kdsmkd qpdok"); TesterObj four = new TesterObj(31,"susan",9.87,"ksmdks qwersc kpaolxnio akmdn"); TesterObj five = new TesterObj(18,"mary",86.32,"dksnd oqoijdl padxl"); my_first_objects.add(one); my_first_objects.add(two); my_first_objects.add(three); my_first_objects.add(four); my_first_objects.add(five); ArrayList<TesterObj> my_second_objects = new ArrayList<TesterObj>(); TesterObj six = new TesterObj(12,"jolly",20.4,"dxksmd oasodkx skldm"); TesterObj seven = new TesterObj(93,"buddy",34.32,"osdk lsldm lasdkoa"); TesterObj eight = new TesterObj(44,"kurt",90.54,"dksmd llamz kmska alsmx"); TesterObj nine = new TesterObj(35,"jimi",923.23,"alsmx zmasx skdm akdm"); TesterObj ten = new TesterObj(42,"kanye",12.43,"aposdkx xksmd"); my_second_objects.add(six); my_second_objects.add(seven); my_second_objects.add(eight); my_second_objects.add(nine); my_second_objects.add(ten); match(my_first_objects, my_second_objects); } // OBJS_ONE and OBJS_TWO MUST BE EQUAL IN SIZE!!! , 3 is number of instance fields to compare public static HashMap<TesterObj,TesterObj> match(ArrayList<TesterObj> objs_one, ArrayList<TesterObj> objs_two) { ArrayList<Integer> diffs = new ArrayList<Integer>(); HashMap<TesterObj,TesterObj> map = new HashMap<TesterObj,TesterObj>(); for(int z=0;z<objs_one.size(); z++) { for(int l = 0;l<objs_two.size(); l++) { System.out.println("THE AGE OF OBJ ONE IS " + objs_one.get(z).age + "THE AGE OF OBJ TWO IS " + objs_two.get(l).age ); diffs.add(Math.abs(objs_one.get(z).age - objs_one.get(l).age)); System.out.println(diffs); } } return map; } }
问题描述
内层循环第一次迭代本应返回7(因为Math.abs(5-12)等于7),但实际返回0;后续迭代也存在错误,比如本该返回Math.abs(5-93)即88,却返回10。
项目目标是:第一个ArrayList中的每个对象遍历第二个ArrayList的所有元素,计算年龄差值,最终返回每个第一个对象对应的最小差值配对。
错误原因
代码中计算差值的行存在笔误:
diffs.add(Math.abs(objs_one.get(z).age - objs_one.get(l).age));
错误地使用objs_one.get(l)取元素,应该改为objs_two.get(l),导致实际计算的是第一个列表内部元素的年龄差,而非两个列表之间的元素差值。
修正后的代码
以下代码修复了笔误,并实现了为第一个列表中的每个对象找到第二个列表中年龄差值最小的对象,存入HashMap返回的功能:
package pckg; import java.util.ArrayList; import java.util.HashMap; public class Tester { public static void main(String[] args) { ArrayList<TesterObj> my_first_objects = new ArrayList<TesterObj>(); TesterObj one = new TesterObj(5,"john",6.8,"HELKEOLOSSJK NHSSB BSBSJBS NS S"); TesterObj two = new TesterObj(25,"eric",12.32,"SKSMK skm1d dms dnms kmdks"); TesterObj three = new TesterObj(15,"sally",2.40,"dskmdnk kmdk kwmd kdsmkd qpdok"); TesterObj four = new TesterObj(31,"susan",9.87,"ksmdks qwersc kpaolxnio akmdn"); TesterObj five = new TesterObj(18,"mary",86.32,"dksnd oqoijdl padxl"); my_first_objects.add(one); my_first_objects.add(two); my_first_objects.add(three); my_first_objects.add(four); my_first_objects.add(five); ArrayList<TesterObj> my_second_objects = new ArrayList<TesterObj>(); TesterObj six = new TesterObj(12,"jolly",20.4,"dxksmd oasodkx skldm"); TesterObj seven = new TesterObj(93,"buddy",34.32,"osdk lsldm lasdkoa"); TesterObj eight = new TesterObj(44,"kurt",90.54,"dksmd llamz kmska alsmx"); TesterObj nine = new TesterObj(35,"jimi",923.23,"alsmx zmasx skdm akdm"); TesterObj ten = new TesterObj(42,"kanye",12.43,"aposdkx xksmd"); my_second_objects.add(six); my_second_objects.add(seven); my_second_objects.add(eight); my_second_objects.add(nine); my_second_objects.add(ten); HashMap<TesterObj, TesterObj> result = match(my_first_objects, my_second_objects); // 打印结果验证 for (var entry : result.entrySet()) { TesterObj obj1 = entry.getKey(); TesterObj obj2 = entry.getValue(); System.out.printf("对象%s(年龄%d) 与 对象%s(年龄%d) 的差值最小:%d%n", obj1.name, obj1.age, obj2.name, obj2.age, Math.abs(obj1.age - obj2.age)); } } public static HashMap<TesterObj,TesterObj> match(ArrayList<TesterObj> objs_one, ArrayList<TesterObj> objs_two) { HashMap<TesterObj,TesterObj> map = new HashMap<TesterObj,TesterObj>(); for(TesterObj objFromOne : objs_one) { int minDiff = Integer.MAX_VALUE; TesterObj bestMatch = null; for(TesterObj objFromTwo : objs_two) { int currentDiff = Math.abs(objFromOne.age - objFromTwo.age); System.out.printf("对象%s(年龄%d) 与 对象%s(年龄%d) 的差值:%d%n", objFromOne.name, objFromOne.age, objFromTwo.name, objFromTwo.age, currentDiff); // 更新最小差值和对应对象 if(currentDiff < minDiff) { minDiff = currentDiff; bestMatch = objFromTwo; } } // 将当前第一个列表对象与最小差值的第二个列表对象配对 map.put(objFromOne, bestMatch); } return map; } } // 补充TesterObj类定义(原代码中缺失) class TesterObj { int age; String name; double num; String desc; public TesterObj(int age, String name, double num, String desc) { this.age = age; this.name = name; this.num = num; this.desc = desc; } }
修正说明
- 修复了差值计算的笔误,改为从
objs_two中取元素计算差值。 - 用增强for循环替代普通for循环,提升代码可读性。
- 为每个第一个列表的对象维护当前最小差值和对应的第二个列表对象,遍历完成后存入HashMap。
- 补充原代码缺失的
TesterObj类定义,确保代码可直接运行。 - 在main方法中添加结果打印逻辑,方便验证配对是否正确。
内容的提问来源于stack exchange,提问作者Dean Loyals
相关产品推荐
相关产品推荐

