`
kanpiaoxue
  • 浏览: 1781190 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

guava的Graph示例

 
阅读更多

 

 

 

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本地缓存案例代码

    在`guava-cache-demo`项目中,你可以找到以上各种功能的具体实现,通过运行这些示例代码,可以更深入地理解Guava Cache的用法。这个案例是学习和理解Guava Cache操作的一个良好起点,可以帮助开发者在实际项目中有效...

    guava-cache.rar

    Guava Cache支持基于时间(如上面示例中的`expireAfterWrite`)和基于访问频率(`expireAfterAccess`)的过期策略,还可以通过`weakKeys`或`weakValues`实现弱引用,让JVM在内存紧张时自动清除不再使用的缓存项。...

    Getting Started with Google Guava英文版

    #### 四、Google Guava的使用示例 1. **使用`ImmutableList`创建不可变列表**: ```java List&lt;String&gt; names = ImmutableList.of("Alice", "Bob", "Charlie"); System.out.println(names); // 输出: [Alice, ...

    第七章 企业项目开发--本地缓存guava cache1

    在上述示例中,AdminMapper接口展示了如何使用MyBatis的注解与Guava Cache相结合。例如,可以在Mapper接口中定义一个方法,利用Guava Cache的特性,将从数据库中查询的结果缓存起来,减少数据库的负担。但是,需要...

    GraphTraversal

    在Java中,我们可以使用多种库来实现图形遍历,例如Apache Commons Graph、JUNG(Java Universal Network/Graph Framework)和Guava的Graphs模块。本示例可能使用了其中一个库,或者自定义了数据结构来表示和操作...

    使用缓冲.

    在上面的代码示例中,我们设置了缓存的最大容量为1000项,如果超过这个限制,最不常使用的项将被自动移除。此外,我们还指定了10分钟的写入后过期时间和5分钟的写入后刷新时间,这意味着如果缓存中的数据在10分钟后...

    MyBatis官方包.rar

    4. **示例项目**:有时会附带一些示例代码或项目,用于演示如何配置和使用MyBatis。 MyBatis的主要特点有: - **SQL定制**:MyBatis允许开发人员编写动态SQL,可以方便地控制SQL的生成,实现灵活的数据查询和更新...

    java开源包1

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包11

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包2

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包3

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包6

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包5

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包10

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包4

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包8

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包7

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包9

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包101

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    Java资源包01

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

Global site tag (gtag.js) - Google Analytics