如何在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
相关产品推荐
相关产品推荐

