• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

奋斗的软件工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

使用双指针技术去除ArrayList中的重复元素

技术博客:使用双指针技术去除ArrayList中的重复元素

在Java编程中,处理集合数据时,去除重复元素是一个常见的需求。本文将介绍如何使用双指针技术来高效地去除 ArrayList 中的重复元素,并通过两种不同的方法进行实现。

1. 问题背景

假设我们有一个包含重复元素的 ArrayList,例如:

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "北京", "上海", "广州", "北京", "深圳", "上海");

我们希望得到一个去重后的列表,例如:

[北京, 广州, 上海, 深圳]

2. 方法1:使用双指针技术

双指针技术是一种高效的算法,特别适用于有序列表的去重操作。以下是实现步骤:

  1. 排序:首先对列表进行排序,以便相同的元素相邻。
  2. 双指针遍历:使用两个指针,一个指向当前元素,另一个指向新列表的末尾。如果当前元素与前一个元素不同,则将其添加到新列表中。
private static ArrayList<String> fun1(ArrayList<String> list) {
    // 对列表进行排序
    list.sort((o1, o2) -> o1.compareTo(o2));

    // 使用双指针技术去除重复元素
    int newSize = removeDuplicates(list);

    ArrayList<String> newList = new ArrayList<>();

    // 将去重后的元素添加到新列表中
    for (int i = 0; i < newSize; i++) {
        newList.add(list.get(i));
    }
    return newList;
}

private static int removeDuplicates(ArrayList<String> list) {
    if (list.isEmpty())
        return 0;

    int j = 1; // 新列表的指针

    // 遍历原始列表
    for (int i = 1; i < list.size(); i++) {
        // 如果当前元素与前一个元素不同,则将其添加到新列表中
        if (!list.get(i).equals(list.get(i - 1)))
            list.set(j++, list.get(i));
    }
    return j; // 返回新列表的大小
}

3. 方法2:使用简单的包含检查

另一种方法是使用简单的包含检查来去除重复元素。遍历原始列表,如果新列表中不包含当前元素,则将其添加到新列表中。

private static ArrayList<String> fun2(ArrayList<String> list) {
    ArrayList<String> newList = new ArrayList<>();
    for (String s : list) {
        // 如果新列表中不包含当前元素,则添加到新列表中
        if (!newList.contains(s))
            newList.add(s);
    }
    return newList;
}

4. 性能比较

  • 双指针技术:时间复杂度为 O(n log n)(排序) + O(n)(遍历),空间复杂度为 O(1)。
  • 包含检查:时间复杂度为 O(n^2),因为每次 contains 操作都需要线性时间。

显然,双指针技术在处理大规模数据时更为高效。

5. 总结

本文介绍了两种去除 ArrayList 中重复元素的方法:双指针技术和简单的包含检查。双指针技术在处理有序列表时表现出色,而包含检查方法则更为直观。根据实际需求选择合适的方法,可以有效提高代码的性能和可读性。

希望这篇博客对你理解和应用双指针技术有所帮助!如果你有任何问题或建议,欢迎在评论区留言。

posted on 2024-11-06 15:07  周政然  阅读(35)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3