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

如何在Java中将列表拆分为多个元素相同的子列表

这个需求其实挺常见的,不管原列表是有序还是无序,我们都能轻松把相同元素归到对应的子列表里。下面给你两种实用的Java实现方案,覆盖不同的开发场景:

方法一:用Java 8+ Stream API(简洁高效)

如果你的项目已经用了Java 8或更高版本,Stream API是最省心的选择,一行流式调用就能搞定分组:

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.stream.Collectors;

public class GroupDuplicates {
    public static void main(String[] args) {
        // 示例无序列表
        List<String> originalList = new ArrayList<>(List.of("b", "a", "a", "b", "b"));
        
        // 核心分组逻辑
        List<List<String>> groupedLists = originalList.stream()
                // 按元素值分组,用LinkedHashMap保持首次出现的顺序(可选)
                .collect(Collectors.groupingBy(
                    s -> s,
                    LinkedHashMap::new,
                    Collectors.toList()
                ))
                .values()
                .stream()
                .collect(Collectors.toList());
        
        // 打印结果
        groupedLists.forEach(System.out::println);
        // 输出顺序会和元素首次出现的顺序一致:[b, b, b], [a, a]
    }
}

小提示:

  • 如果不需要保持元素首次出现的顺序,可以去掉LinkedHashMap::new参数,默认用HashMap(分组顺序可能随机,但不影响内容正确性)。
  • 这个方法天然支持处理null元素(如果你的列表里有null的话)。
方法二:传统HashMap遍历(兼容低版本Java)

如果你的项目还在使用Java 8以下的版本,或者想更直观地控制分组过程,可以用HashMap手动遍历:

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

public class GroupDuplicatesOld {
    public static void main(String[] args) {
        List<String> originalList = new ArrayList<>(List.of("b", "a", "a", "b", "b"));
        Map<String, List<String>> elementMap = new HashMap<>();
        
        for (String element : originalList) {
            // 当map中没有当前元素的键时,自动创建一个空列表
            elementMap.computeIfAbsent(element, k -> new ArrayList<>()).add(element);
        }
        
        // 把map中的值转换成最终的列表
        List<List<String>> groupedLists = new ArrayList<>(elementMap.values());
        
        groupedLists.forEach(System.out::println);
    }
}

逻辑说明:

  • computeIfAbsent方法会帮我们判断:如果当前元素还没作为key存在于map中,就执行lambda创建一个新的ArrayList;如果已经存在,直接拿到对应的列表,把当前元素加进去。
  • 同样,如果需要保持首次出现的顺序,把HashMap换成LinkedHashMap就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:27:28