Java控制台程序问题:如何输出所有高频数字的全部索引?
Java控制台程序逻辑修改方案
核心问题分析
当前代码仅能输出高频数字的首个索引,是因为存储索引的结构(如单个变量或仅存单个值的Map)无法承载同一数字的多个出现位置。要解决这个问题,需调整数据结构并同步修改统计、输出逻辑。
关键修改点
- 将单个索引存储改为索引列表存储:用
Map<Integer, List<Integer>>记录每个数字对应的所有出现位置索引。 - 统计数字出现次数时,同步向对应索引列表中添加当前索引。
- 找到最大出现次数后,遍历筛选出所有达到该次数的数字,再输出它们对应的完整索引列表。
修改后的完整代码示例
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Scanner; public class ArrayFrequencyAnalyzer { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); boolean runAgain; do { // 输入数组大小 System.out.print("请输入整数数组的大小: "); int size = scanner.nextInt(); int[] array = new int[size]; // 输入数组元素 System.out.println("请输入数组的" + size + "个整数元素:"); for (int i = 0; i < size; i++) { array[i] = scanner.nextInt(); } // 展示数组元素及其索引 System.out.println("\n数组元素及其索引:"); for (int i = 0; i < array.length; i++) { System.out.println("索引 " + i + ": " + array[i]); } // 统计每个数字的出现次数和对应索引 Map<Integer, Integer> countMap = new HashMap<>(); Map<Integer, List<Integer>> indexMap = new HashMap<>(); for (int i = 0; i < array.length; i++) { int num = array[i]; // 更新次数统计 countMap.put(num, countMap.getOrDefault(num, 0) + 1); // 更新索引列表:数字不存在则创建空列表,再添加当前索引 indexMap.computeIfAbsent(num, k -> new ArrayList<>()).add(i); } // 找到最大出现次数 int maxCount = 0; for (int count : countMap.values()) { if (count > maxCount) { maxCount = count; } } // 输出所有出现次数最多的数字及其全部索引 System.out.println("\n出现次数最多的数字及其索引:"); for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) { int num = entry.getKey(); int count = entry.getValue(); if (count == maxCount) { List<Integer> indices = indexMap.get(num); System.out.print("数字 " + num + " (出现" + count + "次): "); // 拼接索引列表输出 for (int i = 0; i < indices.size(); i++) { if (i > 0) { System.out.print(", "); } System.out.print(indices.get(i)); } System.out.println(); } } // 询问是否重复执行 System.out.print("\n是否继续执行程序? (输入y继续,其他键退出): "); runAgain = scanner.next().equalsIgnoreCase("y"); } while (runAgain); scanner.close(); System.out.println("程序已退出"); } }
修改说明
- 索引存储结构替换:新增
indexMap,遍历数组时用computeIfAbsent自动为不存在的数字创建空列表,同时将当前索引加入对应列表。 - 统计逻辑同步:在统计数字出现次数的同时完成索引列表填充,避免二次遍历数组,提升效率。
- 输出逻辑调整:找到最大次数后,遍历所有数字筛选出高频数字,再取出对应的完整索引列表进行输出。
示例输出对比
- 原实际输出(仅显示首个索引):
出现次数最多的数字及其索引:
数字 3 (出现2次): 1
- 修改后期望输出:
出现次数最多的数字及其索引:
数字 3 (出现2次): 1, 3
内容的提问来源于stack exchange,提问作者Joronski
相关产品推荐
相关产品推荐

