
本文详解如何正确遍历 ArrayList 并精准输出目标数字在列表中所有出现位置的索引,修正常见逻辑错误(如无条件打印、误用 indexOf()),提供可运行示例与关键注意事项。
本文详解如何正确遍历 arraylist 并精准输出目标数字在列表中**所有出现位置的索引**,修正常见逻辑错误(如无条件打印、误用 `indexof()`),提供可运行示例与关键注意事项。
在 Java 中查找某个数字在 ArrayList
- System.out.println(...) 语句位于 for 循环体外层,导致每次迭代都执行打印(无论是否匹配),造成冗余甚至错误输出;
- 错误调用 list.indexOf(src)——该方法始终返回第一个匹配项的索引,无法反映当前遍历到的真实位置,且在重复元素场景下完全失效(如示例中搜索 3 时反复输出 index 2,实则应分别输出 2 和 3)。
以下是修复后的完整、健壮的实现:
import java.util.ArrayList;
import java.util.Scanner;
public class IndexOf {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList<Integer> list = new ArrayList<>();
// 输入阶段:持续读取整数,直到输入 -1 为止
System.out.println("Enter numbers (one per line, end with -1):");
while (true) {
try {
int input = Integer.parseInt(scanner.nextLine().trim());
if (input == -1) break;
list.add(input);
} catch (NumberFormatException e) {
System.err.println("Invalid input. Please enter an integer.");
continue;
}
}
// 搜索阶段
System.out.print("Search for? ");
int target;
try {
target = scanner.nextInt();
} catch (Exception e) {
System.err.println("Invalid search number.");
scanner.close();
return;
}
scanner.nextLine(); // 消费换行符,避免影响后续输入(本例中暂无后续)
// 关键逻辑:遍历并仅在匹配时输出对应索引
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals(target)) {
System.out.println(target + " is at index " + i);
}
}
scanner.close();
}
}✅ 运行效果(匹配题目示例):
Enter numbers (one per line, end with -1): 1 2 3 3 4 -1 Search for? 3 3 is at index 2 3 is at index 3
? 关键要点说明:
立即学习“Java免费学习笔记(深入)”;
- 索引必须使用循环变量 i:list.get(i).equals(target) 成立时,i 即为当前匹配元素的真实索引,绝不可替换为 list.indexOf(target);
- 输出必须置于 if 块内:确保仅对匹配项执行打印,避免空结果或重复输出;
-
使用 equals() 而非 ==:因 ArrayList
存储的是 Integer 对象,== 比较引用,equals() 才比较数值(尤其在 -128 ~ 127 缓存范围外更安全); - 增加基础异常处理:防止非数字输入导致程序崩溃,提升鲁棒性;
- 注意 scanner.nextInt() 后的换行符残留:调用 scanner.nextLine() 清理缓冲区(虽本例未后续读取,但属良好实践)。
? 进阶提示: 若需将所有索引收集后统一处理(如返回 List










