Graph 在项目中的实践

本文介绍了如何在项目中应用graph结构,特别是利用java的jgrapht-core库。通过引入依赖,定义vo类表示图的依赖关系,创建图的工厂类,并详细说明了供应类、图生成类和图扩展能力的实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

graph 图这种结构在项目中其实经常能够遇见,java 其实提供 jgrapht-core 包来进行核心功能的实现。这里就使用jgrapht-core 来对常见应用场景进行扩展。

实现

1.引入依赖xml

<dependency>
            <groupId>org.jgrapht</groupId>
            <artifactId>jgrapht-core</artifactId>
            <version>1.4.0</version>
        </dependency>

2.我们这里通过vo类来,表明这个graph的依赖关系

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public  class GraphVert {
   
    private String id;

    /**
     * 依赖为id中间逗号分割  1,2,3
     */
    private String dependStr;
}

3.构建一个图的工厂类

public class GraphFactory {
   
    public static IGraphAnalyzer<GraphVert> getGrapthInstance(List<GraphVert> list){
   
        return new GrapthAnalyzer<>(getGraph(),  new VertGenerator(GraphSupplierImpl.get(list)));

    }

    private static Graph<GraphVert,DefaultEdge> getGraph(){
   
        Supplier<GraphVert> supplier = SupplierUtil.createSupplier(GraphVert.class);
        return new SimpleDirectedGraph<>(supplier, SupplierUtil.createDefaultEdgeSupplier(), false);
    }

}

4.将接下来类分为三类
(1)供应类,将GraphVert提供最基本能力
(2)生成图的类,由供应类提供提供基本能力,将供应类生成图
(3)由(2)生成图来扩展一些能力

(1) 供应类

public interface GraphSupplier<T> {
   

    /**
     * 根据info获取id
     */
    String getId(T value);

    /**
     * 获取所有记录
     */
    List<T> get();

    /**
     * 构建记录生成map
     */
    void interatorGenMap();

    /**
     * 获取T对应的依赖
     */
    List<T> depend(String id);


    /**
     * 去除end对before的引用
     * @param before
     * @param end
     */
    void removeDepend(T before,T end);


}

public class GraphSupplierImpl  {
   

    public static GraphSupplier<GraphVert> get(List<GraphVert> graphVertList){
   
        return new GraphSupplier<GraphVert>() {
   
            private List<GraphVert> graphVerts = graphVertList;
            private Map<String, GraphVert> graphVertMap = new HashMap<>();

            @Override
            public String getId(GraphVert value) {
   
                return String.valueOf(value.getId());
            }

            @Override
            public List<GraphVert> get() {
   
                return graphVerts;
            }

            @Override
            public void interatorGenMap() {
   
                Iterator<GraphVert> iterator = graphVerts.iterator();
                while (iterator.hasNext()){
   
                    GraphVert graphVert = iterator.next();
                    graphVertMap.put(getId(graphVert), graphVert);
                }
            }

            @Override
            public List<GraphVert> depend(String id) {
   
                //如果这个点在当前stage集合不存在
                if (!graphVertMap.containsKey(id)) {
   
                    return null;
                }
                List<GraphVert> resultList = new ArrayList<>();
                GraphVert graphVert = graphVertMap.get(id);
                String dependStr = graphVert.getDependStr();
                if (StringUtils.isEmpty(dependStr)) {
   
                    return null;
                }
                String[] dependArray = dependStr.split(",");
                for (String dependId : dependArray) {
   
                    GraphVert dependGraphVert = graphVertMap.get(dependId);
                    if(Objects.nonNull(dependGraphVert)){
   
                        resultList.add(dependGraphVert);
                    }
                }
                return resultList;
            }

            @Override
            public void removeDepend(GraphVert before, GraphVert end) {
   
                Str
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值