Guava库的新工具--Graph

Guava库提供了三种图数据结构:Graph、ValueGraph和Network,分别适用于不同的场景。Graph是最基础的类型,表示节点间的匿名连接;ValueGraph增加了边的权值;Network具有独立的边对象,支持平行边。创建图类型可通过Builder类,可选可变或不可变。不可变类型提供线程安全保证,而可变类型允许添加和删除元素。图的元素必须实现equals()和hashCode(),并保证唯一性。
摘要由CSDN通过智能技术生成

图类型

Graph

Graph是最简单和最基本的图类型。它定义了用于处理节点到节点关系的基本操作,例如获取后继节点:successors(node),获取相邻节点:adjacentNodes(node)和获取节点的入度值:inDegree(node)。它的节点是第一类唯一对象,您可以将它们视为类似于将键映射到图形内部数据结构中。
 

MutableGraph<Integer> graph = GraphBuilder.undirected().build();

ValueGraph

ValueGraph是一个Graph的子类,它可以节点之间的边添加权值,将任意值与边相关联,类似于Map中的值。边的权值不需要是唯一的(因为节点是唯一的)。
例如:ValueGraph <Airport,TransitTime>,定义了一个有向图,其TransitTime对象各自表示从源机场到目的地机场所需的时间。由于两个不同机场对之间的过境时间可以相等,这使得ValueGraph比network更合适。

MutableValueGraph<Airport, TransitTime> roads = ValueGraphBuilder.directed().build();


network

network是一种独立的图类型(既不是图的子类型也不是超类型),它具有Graph所有与节点相关的方法,但也具有一类(唯一)边缘对象。边缘的唯一性约束允许网络本地支持平行边缘,以及处理边缘和节点到边缘关系的方法,例如outEdges(node),incidentNodes(edge)和edgesConnecting(nodeU,nodeV)。

network提供了一个asGraph()方法,它返回network的图形视图。这允许在Graph实例上操作的方法也用于network实例。

MutableNetwork<Status,Work> statusNetWork = NetworkBuilder.directed().build();

选择正确的图表类型

三种图形类型之间的本质区别在于它们的边表示。
Graph的边是节点之间的匿名连接,没有自己的身份或属性。如果每对节点最多由一个边连接,并且不需要将任何信息与边相关联,则您应该使用Graph。

ValueGraph具有具有可以是或可以不是唯一的值(例如,边权重或标签)的边。如果每对节点最多由一个边连接,并且您需要将信息与可能对于不同边(例如边权重)相同的边相关联,则您应该使用ValueGraph。

network具有作为唯一对象的边,就像节点一样。如果边缘对象是唯一的,并且您希望能够发出引用它们的查询,则应使用network。 (请注意,这个唯一性允许Network支持平行边(parallel edges)。)

创建图类型

要创建图形类型的内置实现之一的实例,请使用相应的Builder类:GraphBuilder,ValueGraphBuilder或NetworkBuilder。

 可以通过以下两种方式之一获取图形生成器的实例:
        调用静态方法directed()或者undirected()。 Builder提供的图实例将指定为有向或无向图。<

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值