是否存在兼具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
相关产品推荐
相关产品推荐

