java – 支持布尔查询的内存数据结构
作者:互联网
我需要将数据存储在内存中,我将一个或多个键字符串映射到对象,如下所示:
"green", "blue" -> object1
"red", "yellow" -> object2
因此,在Java中,数据结构可能会实现:
Map<Set<String>, V>
我需要能够有效地接收对象列表,其中字符串匹配一些布尔标准,例如:
("red" OR "green") AND NOT "blue"
我在Java工作,所以理想的解决方案是现成的Java库.但是,如果有必要,我愿意从头开始实施.
有人有主意吗?如果可能的话,我宁愿避免使用内存数据库的开销,我希望能够在速度上与HashMap(或至少相同的数量级)相媲美.
解决方法:
实际上,我喜欢这个问题,所以我按照我之前的答案精神实施了一个完整的解决方案:
一个简单的解决方案,不是线程安全或任何东西,但有趣和一个良好的起点,我猜.
编辑:根据要求进行一些细化
请参阅单元测试以了解用法.
有两个接口,DataStructure< K,V>和查询< V>. DataStructure的行为有点像地图(在我的实现中它实际上与内部映射一起工作),但它也提供了可重用和不可变的查询对象,可以像这样组合:
Query<String> combinedQuery =
structure.and(
structure.or(
structure.search("blue"),
structure.search("red")
),
structure.not(
structure.search("green")
)
);
(查询标记为(蓝色或红色)和非绿色的对象的查询).此查询是可重复使用的,这意味着只要更改了支持映射,它的结果就会发生变化(类似于ITunes智能播放列表).
查询对象已经是线程安全的,但支持映射不是,因此这里有一些改进空间.此外,查询可以缓存它们的结果,但这可能意味着必须扩展接口以提供清除方法(有点像Wicket模型中的分离方法),这不是很好.
至于许可:如果有人想要这个代码,我会很乐意把它放在SourceForge等……
肖恩
标签:java,data-structures,boolean-logic 来源: https://codeday.me/bug/20190526/1158883.html