Scala:表示相同类型对象之间1:1、1:M、M:1和M:M关系的数据结构
在比较基因组学中,识别两个基因组中的同源基因[被认为具有类似功能的基因]在各种应用中都很重要。这两个基因组中的这些基因之间的关系可以是1:1、1:M、M:1和M:M。在Scala中,我编写了这个简单的case类来表示一个基因:Scala:表示相同类型对象之间1:1、1:M、M:1和M:M关系的数据结构,scala,data-structures,many-to-many,relation,many-to-one,Scala,Data Structures,Many To Many,Relation,Many To One,在比较基因组学中,识别两个基因组中的同源基因[被认为具有类似功能的基因]在各种应用中都很重要。这两个基因组中的这些基因之间的关系可以是1:1、1:M、M:1和M:M。在Scala中,我编写了这个简单的case类来表示一个基因: case class Gene(id: Int, protId: String, geneId: String) 此函数用于执行映射: def orthologyMapping(genome1: Array[Gene], genome2: Array[Gene]): V
case class Gene(id: Int, protId: String, geneId: String)
此函数用于执行映射:
def orthologyMapping(genome1: Array[Gene], genome2: Array[Gene]): Vector[HashMap[Gene, Gene]] = { ...
我在文档中找不到这种特定类型的映射关系集合的任何内置类型。正如您所看到的,orthologyMapping()返回类型是Vector[HashMap[Gene,Gene]],该向量包含一组1:1关系的HashMap。HashMap[T,U]表示一个M:1关系,例如
(a->1)、(b->1)
。要表示M:M关系,可以使用HashMap[Gene,Set[Gene]]
。这可以建模一个M:M关系,例如(a->(1,2)),(b->(1,2))
您考虑过将这组关系建模为一个图吗?因为这对我来说似乎是天作之合。如果您想要一个随时可用的库,请查看Verizon OnCue团队的Quiver:
HashMap的使用实际上并没有捕捉到关系的真实性;我现在使用的快速而肮脏的解决方案是Vector[List[List[Gene],List[Gene]]],作为orthologyMapping()函数的返回类型,quiver在我的例子中确实有效;虽然我在寻找更简单、更原始的scala。我最初的想法是使返回类型向量[HashMap[List[Gene],List[Gene]]],因为在每个HashMap中,键和值列表都不能为空[两者都可以至少有on项]