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

