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

是否存在兼具Set去重与Map键查询特性的OOP数据结构?

兼具Set与Map特性的OOP数据结构

存在这类数据结构,它既保证元素唯一性,又支持通过对象自身携带的指定键快速查询,刚好能解决你提到的普通Map键值不一致、普通Set无法按键查找的问题。

核心痛点解决

普通Map需要额外维护外部键与对象内部键(比如示例中的citizenNumber)的一致性,很容易出现put(1, new Person(2, ...))这种键不匹配的错误;而普通Set只能基于整个对象的相等性判断重复,无法直接通过对象内部的某个键快速定位元素。这类兼具特性的结构则直接用对象自身的指定键作为唯一标识,既避免了键值不一致问题,又提供了高效的按键查询能力。

实现方式

这类结构通常可以通过两种方式获得:

  • 语言/库内置结构:部分语言的标准库或第三方工具包提供了现成实现,比如Guava库的KeyedSet(Java)、C#中可通过自定义Dictionary封装实现类似功能;
  • 自定义封装:自己基于Map封装一个集合类,利用对象的指定键作为Map的键,同时在添加元素时校验唯一性,对外暴露Set和Map的核心方法。

自定义示例(Java)

针对你给出的Person类,可封装一个兼具特性的集合:

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

class KeyedPersonSet {
    private final Map<Integer, Person> internalStore = new HashMap<>();

    // 添加元素,以citizenNumber为唯一标识,重复则添加失败
    public boolean add(Person person) {
        if (internalStore.containsKey(person.citizenNumber)) {
            return false;
        }
        internalStore.put(person.citizenNumber, person);
        return true;
    }

    // 通过citizenNumber直接查询Person实例
    public Person get(int citizenNumber) {
        return internalStore.get(citizenNumber);
    }

    // 删除指定公民号对应的元素
    public boolean removeByCitizenNumber(int citizenNumber) {
        return internalStore.remove(citizenNumber) != null;
    }

    // 判断是否存在指定公民号的元素
    public boolean contains(int citizenNumber) {
        return internalStore.containsKey(citizenNumber);
    }
}

使用示例

KeyedPersonSet persons = new KeyedPersonSet();
persons.add(new Person(1, 20, "Paul"));

// 按键查询
Person paul = persons.get(1);
// 尝试添加重复公民号的元素会失败
persons.add(new Person(1, 25, "Paul Duplicate"));

这类结构的本质是用对象自身的唯一键作为内部存储的索引,同时封装成对外兼具Set的唯一性约束和Map的快速查询能力的集合,完美匹配你提出的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:40:13