
本文介绍如何在 java 中通过索引同步查找并打印两个等长 arraylist 中“数值最大项”与其“同位置名称”的配对结果,避免仅获取最大值却丢失对应关系的问题。
在实际开发中,我们常需将两个平行的 ArrayList(如姓名列表与分数列表)进行关联操作。例如,要找出最高分及其对应的学生姓名,不能仅依赖 Collections.max() 获取最大值——因为它只返回值(如 300),不提供该值所在的索引位置,从而无法定位到 students 列表中对应的 "Abraham Lincoln"。
正确的做法是:遍历 scores 列表,手动追踪最大值的索引。以下是优化后的完整实现:
import java.util.ArrayList;
import java.util.List;
public class Names {
public static void main(String[] args) {
ArrayList students = new ArrayList<>();
students.add("John F. Kennedy");
students.add("Donald Trump");
students.add("Theodore Roosevelt");
students.add("Abraham Lincoln");
students.add("Millard Fillmore");
ArrayList scores = new ArrayList<>();
scores.add(100);
scores.add(250);
scores.add(120);
scores.add(300);
scores.add(200);
// 步骤1:初始化最大值索引为0,假设第一个元素最大
int maxIndex = 0;
// 步骤2:遍历scores,更新maxIndex指向真正最大值的位置
for (int i = 1; i < scores.size(); i++) {
if (scores.get(i) > scores.get(maxIndex)) {
maxIndex = i;
}
}
// 步骤3:用同一索引从两个列表中取值并打印
String topStudent = students.get(maxIndex);
int topScore = scores.get(maxIndex);
System.out.println(topStudent + " " + topScore); // 输出:Abraham Lincoln 300
}
} ✅ 关键要点说明:
- 索引一致性是核心:两个 ArrayList 必须长度相等且元素严格一一对应(即 students.get(i) 始终对应 scores.get(i));
- 避免重复遍历:一次循环即可完成索引定位,时间复杂度为 O(n),优于先调用 Collections.max() 再用 indexOf()(后者在最坏情况下会再次遍历);
- 边界安全:代码默认 scores 非空(因已明确添加元素),若需健壮性,可增加 if (scores.isEmpty()) throw new IllegalStateException("Scores list is empty");;
- 扩展建议:对于更复杂的业务场景(如多学生同分、需排序前N名),可考虑封装为 Student 类或使用 Map
,但本例中保持双列表结构更贴合原始需求。
通过掌握索引驱动的关联访问方式,你不仅能解决当前问题,还能为后续处理平行数据结构(如时间序列标签与数值、配置键与值等)打下坚实基础。










