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

Android中如何对ArrayList内的相似字符串进行分组?

高效实现字符串列表的相似元素分组

针对你这个中等规模(1000-30000个元素)的字符串列表分组需求,用HashMap来实现是最优选择——它的平均时间复杂度为O(n),能高效完成分组,同时代码简洁易维护。

核心思路

用HashMap的键(key)存储待分组的字符串,值(value)存储对应字符串的分组列表。遍历原列表时,将每个字符串归入对应的分组;如果是首次遇到该字符串,则新建一个分组存入Map。最后将Map中所有的分组列表转移到similar_group即可。

完整代码实现(JDK 8+ 推荐写法)

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

public class StringGroupingExample {
    public static void main(String[] args) {
        // 初始化原列表(假设已填充1000-30000个String元素)
        ArrayList<String> name = new ArrayList<>();
        for (int i = 0; i < 20000; i++) {
            // 示例填充逻辑,实际替换为你的数据
            name.add(i % 5 == 0 ? "a" : i % 5 == 1 ? "b" : "unique_" + i);
        }

        ArrayList<ArrayList<String>> similar_group = new ArrayList<>();
        Map<String, ArrayList<String>> groupMap = new HashMap<>();

        // 遍历原列表完成分组
        for (String str : name) {
            // computeIfAbsent:如果key不存在则新建列表,否则返回已有列表,然后添加当前元素
            groupMap.computeIfAbsent(str, k -> new ArrayList<>()).add(str);
        }

        // 将所有分组转移到similar_group
        similar_group.addAll(groupMap.values());

        // 验证结果(可选)
        for (ArrayList<String> group : similar_group) {
            System.out.println("分组内容:" + group + ",元素数量:" + group.size());
        }
    }
}

JDK 8 之前的兼容写法

如果你的项目使用JDK 8以下版本,可以用手动判断的方式替代computeIfAbsent:

for (String str : name) {
    ArrayList<String> currentGroup = groupMap.get(str);
    if (currentGroup == null) {
        currentGroup = new ArrayList<>();
        groupMap.put(str, currentGroup);
    }
    currentGroup.add(str);
}

方案优势

  • 高效性:HashMap的查找、插入操作平均时间复杂度为O(1),遍历整个列表仅需O(n)时间,3万级元素的处理几乎瞬间完成,远优于嵌套循环的O(n²)方案。
  • 完整性:不管是重复出现多次的元素,还是仅出现一次的唯一元素,都会被正确归入独立的分组,完全符合你的需求。
  • 简洁性:代码逻辑清晰,无需复杂的条件判断,易于理解和维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:20:37