如何删除 HashMap 中的重复元素?—— 99% 的人不知道的第 3 种实现思路

在 Java 开发中,HashMap 是一种常用的数据结构,用于存储键值对。它具有快速查找的特点,因此在许多场合都被广泛应用。然而,当我们使用 HashMap 时,有时可能会遇到需要删除重复元素的情况。
在这篇文章中,我们将探讨三种不同的方法来处理 HashMap 中的重复元素,并重点讲解最后一种使用 Stream 的方法,很多人对此并不熟悉。

一、HashMap 的特点

首先,让我们了解一下 HashMap 的几个主要特点:

  1. 唯一性:HashMap 中的 key 是唯一的。如果你尝试插入相同的 key,它会将新值覆盖旧值。

  2. 无序性:HashMap 不保证其元素的顺序。即使是相同的插入顺序,遍历时也可能得到不同的顺序。

  3. 效率高:HashMap 基于哈希表实现,提供 O(1) 的平均时间复杂度用于查找和插入操作。

  4. 允许 null 值:HashMap 可以存储 null 值(作为值和一个 key)。

这些特点使得 HashMap 在许多开发场景中成为首选数据结构,例如缓存、图书管理系统等。

现实生活中的类比

想象一下,你有一个字典,每个单词(key)都对应一个定义(value)。如果你再次输入已经存在的单词,字典会更新这个单词的定义,而不是重复添加。这就是 HashMap 的主要特性。

二、为什么要删除 HashMap 中的重复元素?

在某些情况下,尽管 HashMap 中的 key 是唯一的,但值(value)可能会重复。例如,在用户注册系统中,有多个用户可能因为错误或重复提交而使用同样的邮箱地址。为了确保数据的唯一性和一致性,我们需要从 HashMap 中删除重复的值。

三、三种实现思路

接下来,我们将介绍三种不同的方法来删除 HashMap 中的重复元素。

方法一:新创建 Map 添加不重复元素

这种方法简单直接,我们可以遍历原来的 HashMap,将不重复的元素添加到一个新的 HashMap 中。

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

public class RemoveDuplicatesExample1 {
    public static void main(String[] args) {
        // 原始 HashMap
        HashMap<String, String> originalMap = new HashMap<>();
        originalMap.put("001", "Java Programming");
        originalMap.put("002", "Data Structures");
        originalMap.put("003", "Java Programming"); // 重复元素

        // 新建一个 HashMap 存放不重复的元素
        HashMap<String, String> uniqueMap = new HashMap<>();

        // 遍历原始 HashMap
        for (Map.Entry<String, String> entry : originalMap.entrySet()) {
            // 如果 uniqueMap 不包含该值,则添加
            if (!uniqueMap.containsValue(entry.getValue())) {
                uniqueMap.put(entry.getKey(), entry.getValue());
            }
        }

        // 输出结果
        System.out.println("Unique Map: " + uniqueMap);
    }
}

解析:
  1. 创建一个新的 uniqueMap。

  2. 遍历原始的 originalMap,检查是否已经存在相同的 value。

  3. 将不重复的键值对添加到新的 HashMap 中。

方法二:添加 Set 再删除重复元素

这个方法利用了 Set 集合的特性,因为 Set 不允许存储重复元素。我们可以先把所有的值添加到一个 Set 中,再根据这个 Set 来构建新的 HashMap。

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class RemoveDuplicatesExample2 {
    public static void main(String[] args) {
        // 原始 HashMap
        HashMap<String, String> originalMap = new HashMap<>();
        originalMap.put("001", "Java Programming");
        originalMap.put("002", "Data Structures");
        originalMap.put("003", "Java Programming"); // 重复元素

        // 使用 Set 存储唯一的值
        Set<String> uniqueValues = new HashSet<>(originalMap.values());

        // 新建一个 HashMap 存放不重复的元素
        HashMap<String, String> uniqueMap = new HashMap<>();

        // 遍历原始 HashMap,并基于 Set 构建新 HashMap
        for (String value : uniqueValues) {
            for (Map.Entry<String, String> entry : originalMap.entrySet()) {
                if (entry.getValue().equals(value)) {
                    uniqueMap.put(entry.getKey(), entry.getValue());
                    break; // 找到后跳出内层循环
                }
            }
        }

        // 输出结果
        System.out.println("Unique Map using Set: " + uniqueMap);
    }
}

解析:
  1. 将原始 HashMap 的所有值存入 Set 中,以便自动去重。

  2. 通过两层循环,将基于 Set 的唯一值构建新的 HashMap。

方法三:使用 Stream 删除重复元素

这是最现代化的方法,使用 Java 8 引入的 Stream API,可以让代码更加简洁。Stream 可以帮助我们更高效地处理集合数据。

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class RemoveDuplicatesExample3 {
    public static void main(String[] args) {
        // 原始 HashMap
        HashMap<String, String> originalMap = new HashMap<>();
        originalMap.put("001", "Java Programming");
        originalMap.put("002", "Data Structures");
        originalMap.put("003", "Java Programming"); // 重复元素

        // 使用 Stream 去重
        Map<String, String> uniqueMap = originalMap.entrySet()
                .stream()
                .filter(entry -> 
                        originalMap.values().stream().filter(v -> v.equals(entry.getValue())).count() == 1)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

        // 输出结果
        System.out.println("Unique Map using Stream: " + uniqueMap);
    }
}

解析:
  1. 使用 entrySet() 获取所有条目并转为流式操作。

  2. 通过 filter() 方法仅保留那些只出现一次的值。

  3. 最后,通过 collect() 方法将结果收集到新的 HashMap 中。

四、为什么不是根据 Key 去重?

如前所述,HashMap 的 key 是唯一的。如果我们尝试插入一个已有的 key,新值将替换旧值,因此在 HashMap 中“去重”实际上指的是值(value)的去重。

实际例子

例如,在一个用户注册系统中,邮箱地址通常作为 key 存储相关用户信息。如果同一邮箱被多次注册,我们希望保留最后一次的注册信息,而不是删除或覆盖它们。这就是我们需要对 values 进行去重的原因。

五、总结

在本文中,我们探讨了在 HashMap 中删除重复元素的三种方法:

  1. 新创建 Map 添加不重复元素:简单直观,适合新手理解。

  2. 添加 Set 再删除重复元素:利用 Set 的特性实现去重。

  3. 使用 Stream 删除重复元素:现代化的方式,适合熟悉 Java 8 的开发者。

希望这篇文章能帮助你理解如何在 HashMap 中处理重复元素的问题!如果你还有其他问题或者想了解更多,请随时提问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

途途途途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值