前言
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

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

被折叠的 条评论
为什么被折叠?



