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

Java实现:统计无序ArrayList中重复元素序列出现次数的函数

Java函数:统计元素的重复序列出现次数

我来帮你实现这个需求。核心思路是先遍历原数组,统计每个值对应的连续序列出现次数(单次出现也算一个序列),然后根据这个统计结果生成新列表,全程不会修改原数组内容。

实现步骤

  1. 统计序列次数:用一个HashMap记录每个值的序列出现次数。遍历原数组时,只要当前元素和前一个元素不同,就给当前元素的计数加1(首次出现则设为1)。
  2. 生成结果列表:再次遍历原数组,将每个元素对应的序列次数存入新列表,这样就能保证新列表和原列表尺寸一致,且每个位置对应正确的计数。

完整代码

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

public class SequenceCounter {
    public static ArrayList<Integer> countSequenceOccurrences(ArrayList<Integer> original) {
        // 处理空输入
        if (original == null || original.isEmpty()) {
            return new ArrayList<>();
        }

        Map<Integer, Integer> sequenceCountMap = new HashMap<>();
        Integer previous = original.get(0);
        // 初始化第一个元素的序列计数
        sequenceCountMap.put(previous, 1);

        // 遍历数组统计序列次数
        for (int i = 1; i < original.size(); i++) {
            Integer current = original.get(i);
            if (!current.equals(previous)) {
                // 更新当前元素的序列计数:存在则加1,不存在则设为1
                sequenceCountMap.put(current, sequenceCountMap.getOrDefault(current, 0) + 1);
                previous = current;
            }
        }

        // 生成结果列表
        ArrayList<Integer> result = new ArrayList<>();
        for (Integer num : original) {
            result.add(sequenceCountMap.get(num));
        }

        return result;
    }

    // 测试示例
    public static void main(String[] args) {
        // 示例1
        ArrayList<Integer> arr1 = new ArrayList<>();
        arr1.add(3);
        arr1.add(0);
        arr1.add(1);
        arr1.add(2);
        arr1.add(1);
        arr1.add(1);
        arr1.add(1);
        arr1.add(3);
        System.out.println(countSequenceOccurrences(arr1)); // 输出 [2,1,2,1,2,2,2,2]

        // 示例2
        ArrayList<Integer> arr2 = new ArrayList<>();
        arr2.add(1);
        arr2.add(0);
        arr2.add(1);
        arr2.add(2);
        arr2.add(1);
        arr2.add(3);
        System.out.println(countSequenceOccurrences(arr2)); // 输出 [3,1,3,1,3,1]

        // 示例3
        ArrayList<Integer> arr3 = new ArrayList<>();
        arr3.add(1);
        arr3.add(0);
        arr3.add(0);
        arr3.add(2);
        arr3.add(1);
        arr3.add(3);
        arr3.add(0);
        System.out.println(countSequenceOccurrences(arr3)); // 输出 [2,2,2,1,2,1,2]
    }
}

代码说明

  • 原数组保护:全程只读取原数组的元素,没有任何修改操作,确保原数组内容不变。
  • 边界处理:考虑了输入为空的情况,直接返回空列表。
  • HashMap的使用:getOrDefault方法简化了计数更新逻辑,避免了判断元素是否存在的冗余代码。
  • 效率:两次遍历数组,时间复杂度为O(n),空间复杂度主要由HashMap决定,最坏情况是所有元素都不同,空间复杂度O(n)。

你可以直接把这个函数放到你的项目里,或者根据自己的需求调整细节(比如处理null元素的情况,只需要在比较时加null判断即可)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:30:22