public interface Node<T> { T get(); }
public interface Edge<T> { T get(); }
public class DataEntity implements Node<DataEntity> { private final String nameSpace; private final String entityName; public DataEntity(String nameSpace, String entityName) { super(); this.nameSpace = nameSpace; this.entityName = entityName; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } DataEntity other = (DataEntity) obj; if (entityName == null) { if (other.entityName != null) { return false; } } else if (!entityName.equals(other.entityName)) { return false; } if (nameSpace == null) { if (other.nameSpace != null) { return false; } } else if (!nameSpace.equals(other.nameSpace)) { return false; } return true; } @Override public DataEntity get() { return this; } public String getEntityName() { return entityName; } public String getNameSpace() { return nameSpace; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((entityName == null) ? 0 : entityName.hashCode()); result = prime * result + ((nameSpace == null) ? 0 : nameSpace.hashCode()); return result; } @Override public String toString() { return "DataEntity [nameSpace=" + nameSpace + ", entityName=" + entityName + "]"; } }
public class DataRelationShip implements Edge<DataRelationShip> { private final String sourceColumn; private final String targetColumn; public DataRelationShip(String sourceColumn, String targetColumn) { super(); this.sourceColumn = sourceColumn; this.targetColumn = targetColumn; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } DataRelationShip other = (DataRelationShip) obj; if (sourceColumn == null) { if (other.sourceColumn != null) { return false; } } else if (!sourceColumn.equals(other.sourceColumn)) { return false; } if (targetColumn == null) { if (other.targetColumn != null) { return false; } } else if (!targetColumn.equals(other.targetColumn)) { return false; } return true; } @Override public DataRelationShip get() { return this; } public String getSourceColumn() { return sourceColumn; } public String getTargetColumn() { return targetColumn; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((sourceColumn == null) ? 0 : sourceColumn.hashCode()); result = prime * result + ((targetColumn == null) ? 0 : targetColumn.hashCode()); return result; } @Override public String toString() { return "DataRelationShip [sourceColumn=" + sourceColumn + ", targetColumn=" + targetColumn + "]"; } }
public class LearnGraphs { public static void main(String[] args) { test(); } static void test() { /** * <pre> * Graph * a -> c * -> b -> d -> e * </pre> */ MutableValueGraph<Node<DataEntity>, Edge<DataRelationShip>> graph = ValueGraphBuilder.directed().build(); String nameSpace = "nameSpace"; Node<DataEntity> a = new DataEntity(nameSpace, "a"); Node<DataEntity> b = new DataEntity(nameSpace, "b"); Node<DataEntity> c = new DataEntity(nameSpace, "c"); Node<DataEntity> d = new DataEntity(nameSpace, "d"); Node<DataEntity> e = new DataEntity(nameSpace, "e"); Node<DataEntity> eClone = new DataEntity(nameSpace, "e"); Edge<DataRelationShip> ab = new DataRelationShip("a", "b"); Edge<DataRelationShip> ac = new DataRelationShip("a", "c"); Edge<DataRelationShip> bd = new DataRelationShip("b", "d"); Edge<DataRelationShip> de = new DataRelationShip("d", "e"); // Edge<DataRelationShip> ea = new DataRelationShip("e", "a"); putEdgeValue(graph, a, b, ab); putEdgeValue(graph, a, c, ac); putEdgeValue(graph, b, d, bd); putEdgeValue(graph, d, e, de); // putEdgeValue(graph, e, a, ea); System.out.println(graph.toString()); System.out.println(Graphs.hasCycle(graph.asGraph())); System.out.println(graph.adjacentNodes(b)); System.out.println(StringUtils.repeat("-", 100)); System.out.println(graph.predecessors(a)); System.out.println(graph.successors(a)); System.out.println(StringUtils.repeat("-", 100)); System.out.println(graph.predecessors(b)); System.out.println(graph.successors(b)); System.out.println(StringUtils.repeat("-", 100)); System.out.println(graph.predecessors(eClone)); System.out.println(graph.successors(eClone)); /** * * output: * * <pre> * isDirected: true, allowsSelfLoops: false, nodes: [DataEntity [nameSpace=nameSpace, entityName=a], DataEntity [nameSpace=nameSpace, entityName=b], DataEntity [nameSpace=nameSpace, entityName=c], DataEntity [nameSpace=nameSpace, entityName=d], DataEntity [nameSpace=nameSpace, entityName=e]], edges: {<DataEntity [nameSpace=nameSpace, entityName=a] -> DataEntity [nameSpace=nameSpace, entityName=c]>=DataRelationShip [sourceColumn=a, targetColumn=c], <DataEntity [nameSpace=nameSpace, entityName=a] -> DataEntity [nameSpace=nameSpace, entityName=b]>=DataRelationShip [sourceColumn=a, targetColumn=b], <DataEntity [nameSpace=nameSpace, entityName=b] -> DataEntity [nameSpace=nameSpace, entityName=d]>=DataRelationShip [sourceColumn=b, targetColumn=d], <DataEntity [nameSpace=nameSpace, entityName=d] -> DataEntity [nameSpace=nameSpace, entityName=e]>=DataRelationShip [sourceColumn=d, targetColumn=e]} * false * [DataEntity [nameSpace=nameSpace, entityName=d], DataEntity [nameSpace=nameSpace, entityName=a]] * ---------------------------------------------------------------------------------------------------- * [] * [DataEntity [nameSpace=nameSpace, entityName=c], DataEntity [nameSpace=nameSpace, entityName=b]] * ---------------------------------------------------------------------------------------------------- * [DataEntity [nameSpace=nameSpace, entityName=a]] * [DataEntity [nameSpace=nameSpace, entityName=d]] * ---------------------------------------------------------------------------------------------------- * [DataEntity [nameSpace=nameSpace, entityName=d]] * [] * * </pre> */ } static void putEdgeValue(MutableValueGraph<Node<DataEntity>, Edge<DataRelationShip>> graph, Node<DataEntity> a, Node<DataEntity> b, Edge<DataRelationShip> ab) { graph.putEdgeValue(a, b, ab); Preconditions.checkArgument(!Graphs.hasCycle(graph.asGraph()), "from node:%s to node:%s with the edge:%s will form the cycle.", a, b, ab); } }
相关推荐
在`guava-cache-demo`项目中,你可以找到以上各种功能的具体实现,通过运行这些示例代码,可以更深入地理解Guava Cache的用法。这个案例是学习和理解Guava Cache操作的一个良好起点,可以帮助开发者在实际项目中有效...
Guava Cache支持基于时间(如上面示例中的`expireAfterWrite`)和基于访问频率(`expireAfterAccess`)的过期策略,还可以通过`weakKeys`或`weakValues`实现弱引用,让JVM在内存紧张时自动清除不再使用的缓存项。...
#### 四、Google Guava的使用示例 1. **使用`ImmutableList`创建不可变列表**: ```java List<String> names = ImmutableList.of("Alice", "Bob", "Charlie"); System.out.println(names); // 输出: [Alice, ...
在上述示例中,AdminMapper接口展示了如何使用MyBatis的注解与Guava Cache相结合。例如,可以在Mapper接口中定义一个方法,利用Guava Cache的特性,将从数据库中查询的结果缓存起来,减少数据库的负担。但是,需要...
在Java中,我们可以使用多种库来实现图形遍历,例如Apache Commons Graph、JUNG(Java Universal Network/Graph Framework)和Guava的Graphs模块。本示例可能使用了其中一个库,或者自定义了数据结构来表示和操作...
在上面的代码示例中,我们设置了缓存的最大容量为1000项,如果超过这个限制,最不常使用的项将被自动移除。此外,我们还指定了10分钟的写入后过期时间和5分钟的写入后刷新时间,这意味着如果缓存中的数据在10分钟后...
4. **示例项目**:有时会附带一些示例代码或项目,用于演示如何配置和使用MyBatis。 MyBatis的主要特点有: - **SQL定制**:MyBatis允许开发人员编写动态SQL,可以方便地控制SQL的生成,实现灵活的数据查询和更新...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...