系统相关
首页 > 系统相关> > java – 支持布尔查询的内存数据结构

java – 支持布尔查询的内存数据结构

作者:互联网

我需要将数据存储在内存中,我将一个或多个键字符串映射到对象,如下所示:

"green", "blue" -> object1
"red", "yellow" -> object2

因此,在Java中,数据结构可能会实现:

Map<Set<String>, V>

我需要能够有效地接收对象列表,其中字符串匹配一些布尔标准,例如:

("red" OR "green") AND NOT "blue"

我在Java工作,所以理想的解决方案是现成的Java库.但是,如果有必要,我愿意从头开始实施.

有人有主意吗?如果可能的话,我宁愿避免使用内存数据库的开销,我希望能够在速度上与HashMap(或至少相同的数量级)相媲美.

解决方法:

实际上,我喜欢这个问题,所以我按照我之前的答案精神实施了一个完整的解决方案:

http://pastebin.com/6iazSKG9

一个简单的解决方案,不是线程安全或任何东西,但有趣和一个良好的起点,我猜.

编辑:根据要求进行一些细化

请参阅单元测试以了解用法.

有两个接口,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