You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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("程序已退出");
    }
}

修改说明

  1. 索引存储结构替换:新增indexMap,遍历数组时用computeIfAbsent自动为不存在的数字创建空列表,同时将当前索引加入对应列表。
  2. 统计逻辑同步:在统计数字出现次数的同时完成索引列表填充,避免二次遍历数组,提升效率。
  3. 输出逻辑调整:找到最大次数后,遍历所有数字筛选出高频数字,再取出对应的完整索引列表进行输出。

示例输出对比

  • 原实际输出(仅显示首个索引):

出现次数最多的数字及其索引:
数字 3 (出现2次): 1

  • 修改后期望输出:

出现次数最多的数字及其索引:
数字 3 (出现2次): 1, 3

内容的提问来源于stack exchange,提问作者Joronski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:25:21