Java中是否存在定向非循环图(DAG)数据类型,我应该使用它吗?

我正在用Java建模一个电源子系统。 一个简单的SQLite数据库包含一组线路可替换单元(LRU)以及它们之间的连接。 我正在编写一个Power Model API来简化数据存储的查询,使用DDD模式和存储库。

我正在寻找一个合适的Java集合来建模查询结果。 LRU连接流中有一些特殊情况需要建模:

  1. 最初,有一个带有多个端口(<= 16)的配电单元(PDU),为下游LRU供电。
  2. 功率流中的典型连接涉及功率源的单个源LRU和功率耗尽的单个Sink LRU。
  3. 然而,下游可能存在连接到多个宿LRU的单个源LRU。
  4. 电源流中没有循环。

包含上面的#3使我开始考虑从API返回查询结果作为树。 但是我在java.util中找到的唯一一棵树是一个TreeMap键值配对的红黑树,这似乎不合适(或者我想不出用它来建模电源流的适当抽象。)I我也一直在考虑使用LinkedHashSet ,但我不相信它也适合。 我不清楚这个结构中的节点如何指向下游节点。

在这一点上,我并不关心时间和空间的效率。 我的API必须通过向外部客户端(即基于Java的电源监视和控制应用程序的表示层)提供电源连接信息来工作。对开源数据类型/库的使用也没有限制。

在一般的计算机科学术语中,我真正寻求的是有向无环图(DAG)。

是否有针对Java的实现? 我是否认为DAG适合我的情况?

我不知道它是否可以帮助,但看看JGraphT 。

正如您所看到的那样,对于“相关”问题,已经提出了类似的问题。 不, Java没有通用的图形/树/ DAG数据类型 (如果我们不计算Swing的TreeModel)。

做你自己的。


这是一个示例(只读)接口:

interface Node, E extends Edge> { public Set outgoingEdges(); public Set ingoingEdges(); } interface Edge, E extends Edge> { public E source(); public E sink(); } 

你会的

 interface LRU implements Node { ... } interface Line implements Edge { ... } 

(或代课)。

对于这个特殊问题。 我决定使用Guava的LinkedListMultimap 。

FWIW如果有人想要一个只有标准库的解决方案,那么集合的地图或其他集合的地图也可以完成这项工作,尽管不是这样。