首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用哈希表的关系数据

使用哈希表的关系数据
EN

Stack Overflow用户
提问于 2015-10-02 19:11:15
回答 1查看 117关注 0票数 3

我试图在内存中保存由以下模式标识的一组数据结构。我有一个粗略的解决方案,但我正在寻找一些更好的想法。性能和可靠性是至关重要的,内存(在合理范围内)并不是很重要,因为表相当小(最多几百个条目,更可能是几十个条目)。我想,我不想为这么小的数据集使用内存中的DB。

我想要实现的是能够快速查询基于A.Name的所有B条目、基于B.Name的所有A条目或基于T.Tag的所有A条目(我目前并不需要基于T.Tag的所有B条目,但将来可能会有用)

目前,我使用三个具有重复数据的表,以及由此带来的同步问题,当我有了一个新的数据时,我会以三种不同的方式存储它。我相信一定有更好的办法。

代码语言:javascript
代码运行次数:0
运行
复制
// all A entries matching a tag
val Tag2A= new MutableHashMap[String, MutableSet[String]]() with MutableMultiMap[String, String] 

// all B entries matching a tag
val Tag2B = new MutableHashMap[String, MutableSet[List[Int]]]() with MutableMultiMap[String, List[Int]]

// all Tags matching a A entry
val A2Tag = new MutableHashMap[String, MutableSet[String]]() with MutableMultiMap[String, String]

有人能推荐一个更优雅的解决方案吗?

编辑:(澄清)我的MutableMultiMap和MutableSet只是导入时的mutable.MultiMap和mutable.Set。

EDIT2:表需要修改(添加/删除)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-02 23:05:57

假设您可以将所有内容加载到内存中,则不可变的解决方案是可以接受的:

代码语言:javascript
代码运行次数:0
运行
复制
 abstract class A2B(tag: String) {
   def aMap: Map[String, A]
   def bMap: Map[String, B]
 }

 case class A(id: String, name: String, tag: A2B, payload: String)

 case class B(id: String, name: String, tag: A2B, payload: List[Int])

您可以这样初始化它(以解决chicken-egg problem):

代码语言:javascript
代码运行次数:0
运行
复制
def getA2b(name: String): A2B = new A2B(name) {
    val aMap = { //you can query your external data source tableA here
        val a1 = "a1" -> A("a1", "a1", this, "aaaa")
        val a2 = "a2" -> A("a2", "a2", this, "aaaa")
        Map(a1, a2)
    }

    val bMap = { //you can query your external data source tableB here
        val b1 = "b1" -> B("b1", "b1", this, Nil)
        val b2 = "b2" -> B("b2", "b2", this, Nil)
        Map(b1, b2)
    } 

    override def toString = name
}


val a2b = Map("a2b1" -> getA2b("a2b1")) //you can query your external data source tableA2B here

和具有常量访问时间的查询(抱歉,当前机器上还没有Scala ):

代码语言:javascript
代码运行次数:0
运行
复制
println(a2b("a2b1"))
println(a2b("a2b1").aMap)
println(a2b("a2b1").aMap("a1").tag.bMap)

a2b1                                                                                                                                                                                                                                                   
Map(a1 -> A(a1,a1,a2b1,aaaa), a2 -> A(a2,a2,a2b1,aaaa))                                                                                                                                                                                                
Map(b1 -> B(b1,b1,a2b1,List()), b2 -> B(b2,b2,a2b1,List()))

这里的所有关系都是用链接建模的,所以没有开销。这个结构是不可变的,所以它是线程安全的。您还可以注意到,A2B类在构造函数中被初始化(默认情况下所有的A2B都是最终的),因此根据JSR-133没有同步问题--您的应用程序总是看到A2B的最终版本,因此不需要挥发。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32914236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档