Dart中如何实现集合与嵌套集合内子集合的精确匹配
集合完全匹配实现方案
基础定义
嵌套集合receipt存储了所有菜品对应的原料集合,初始化代码如下:
Set dish1 = {'a', 'b'}; Set dish2 = {'c', 'd'}; Set dish3 = {'a', 'b', 'c'}; Set dish4 = {'a', 'b', 'c', 'd'}; Set receipt = {dish1, dish2, dish3, dish4};
匹配要求
传入原料集合material,需要从receipt中找到匹配的菜品集合,匹配规则如下:
- 两个集合的元素必须完全相同,存在多余元素或者缺失元素都不算匹配
- 集合本身是无序结构,判断时不需要考虑元素的排列顺序
匹配结果参考示例:
Set material1 = {'a', 'b'}; // 返回 dish1 Set material2 = {'a', 'b', 'c'}; // 返回 dish3 Set material3 = {'a', 'b', 'd'}; // 无匹配,返回 null Set material4 = {'b', 'c', 'a'}; // 元素和dish3完全一致,返回 dish3
规则补充:
material3 = {'a', 'b', 'd'}虽然包含了dish1的所有原料,但多了'd'、缺少对应其他菜品需要的'c',不满足完全一致的要求,所以不会匹配到dish1;material4只是元素顺序和dish3不同,元素本身完全重合,所以可以正常匹配。
实现方法
直接用编程语言原生的Set相等判断逻辑即可,几乎所有语言的Set类型的相等判断,默认就符合「元素完全一致、忽略顺序」的规则,不需要手动遍历逐个比对元素。
核心逻辑就是遍历receipt里的每一个dish集合,和传入的material做相等判断,找到第一个匹配的直接返回,全部遍历完没找到匹配项就返回null。
不同语言的简单实现参考:
Java 版本
public Set findMatchedDish(Set material, Set<Set> receipt) { for (Set dish : receipt) { if (dish.equals(material)) { return dish; } } return null; }
Python 版本
def find_matched_dish(material: set, receipt: list[set]) -> set | None: for dish in receipt: if dish == material: return dish return None
内容的提问来源于stack exchange,提问作者Graphite
相关产品推荐
相关产品推荐

