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

如何修改Java代码实现数组重复元素的单次统计输出?

解决数组元素重复次数统计重复输出的问题

我来帮你搞定这个问题!你遇到的核心问题是原代码会对每个重复元素都执行一次统计打印,所以同一个数字的结果会重复出现多次。咱们来一步步优化代码,实现每个数字只输出一次统计结果的需求。

先分析原代码的问题

原代码的问题出在这两点:

  • 外层循环遍历数组的每一个元素,当遇到重复元素时,会再次触发统计逻辑
  • 内部循环每次找到匹配项就立刻打印,而不是等统计完当前数字的所有重复项后再一次性输出

解决方案1:基于排序数组优化(利用你已有的排序逻辑)

既然你已经用了Arrays.sort()把数组排序,相同元素会相邻排列,那我们可以利用这个特性,统计完当前数字的总次数后,直接跳过所有重复元素,只打印一次结果:

import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        int[] array = {2, 0, -12, 0, 23, 45, -4, -5, 2, 23, 0, 9, -7};
        Arrays.sort(array);
        
        int i = 0;
        while (i < array.length) {
            int currentNum = array[i];
            int count = 1; // 数字本身至少出现1次
            
            // 统计后续所有相同的元素
            while (i + count < array.length && array[i + count] == currentNum) {
                count++;
            }
            
            // 只打印一次当前数字的统计结果
            System.out.println(currentNum + " repeats " + count + " times");
            // 直接跳到下一个不同的元素,避免重复处理
            i += count;
        }
    }
}

如果想要像你说的那样,把所有结果用分号分隔在一行输出,可以稍微修改成这样:

import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        int[] array = {2, 0, -12, 0, 23, 45, -4, -5, 2, 23, 0, 9, -7};
        Arrays.sort(array);
        
        StringBuilder resultBuilder = new StringBuilder();
        int i = 0;
        while (i < array.length) {
            int currentNum = array[i];
            int count = 1;
            while (i + count < array.length && array[i + count] == currentNum) {
                count++;
            }
            
            // 拼接结果,非第一个元素前加分号
            if (resultBuilder.length() > 0) {
                resultBuilder.append("; ");
            }
            resultBuilder.append(currentNum + " repeats " + count + " times");
            
            i += count;
        }
        
        // 一次性输出所有结果
        System.out.println(resultBuilder.toString());
    }
}

解决方案2:使用HashMap统计(无需排序,更灵活)

如果不想依赖排序,可以用HashMap来存储每个数字的出现次数,遍历完数组后再统一输出,这种方法逻辑更直观:

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        int[] array = {2, 0, -12, 0, 23, 45, -4, -5, 2, 23, 0, 9, -7};
        Map<Integer, Integer> numCountMap = new HashMap<>();
        
        // 遍历数组,统计每个数字的出现次数
        for (int num : array) {
            // 用getOrDefault简化:如果数字不存在,默认次数为0,加1后存入
            numCountMap.put(num, numCountMap.getOrDefault(num, 0) + 1);
        }
        
        // 遍历Map,每个数字只输出一次结果
        StringBuilder resultBuilder = new StringBuilder();
        for (Map.Entry<Integer, Integer> entry : numCountMap.entrySet()) {
            if (resultBuilder.length() > 0) {
                resultBuilder.append("; ");
            }
            resultBuilder.append(entry.getKey() + " repeats " + entry.getValue() + " times");
        }
        
        System.out.println(resultBuilder.toString());
    }
}

这两种方法都能解决你的问题,选哪种取决于你的需求:如果需要保持排序后的顺序,选第一种;如果不需要排序,第二种更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:17:58