Java图形和图形搜索API

Java图形和图形搜索API,java,collections,graph,Java,Collections,Graph,我需要在图结构中对一组JavaBean建模,其中每个bean都是图上的一个节点/顶点,它们通过和边彼此“连接”/“相关” 因此,就像使用列表或数组列表来表示项目序列一样,我需要一个(最好是通用的)API来表示图中的节点。这个API需要允许我构建图,以我喜欢的方式从图中添加/删除节点,等等 另外,我需要能够通过传递任意数据值来搜索整个图,它将返回包含该数据的节点/顶点 我唯一能找到的就是内置的JavaTreeSet,但我不需要从单个根节点流出来的定向树。我需要一个真正的(数学意义上的)图形API

我需要在图结构中对一组JavaBean建模,其中每个bean都是图上的一个节点/顶点,它们通过和边彼此“连接”/“相关”

因此,就像使用
列表
数组列表
来表示项目序列一样,我需要一个(最好是通用的)API来表示图中的节点。这个API需要允许我构建图,以我喜欢的方式从图中添加/删除节点,等等

另外,我需要能够通过传递任意数据值来搜索整个图,它将返回包含该数据的节点/顶点

我唯一能找到的就是内置的Java
TreeSet
,但我不需要从单个根节点流出来的定向树。我需要一个真正的(数学意义上的)图形API


这样的解决方案存在吗?还是我一直在白手起家地写自己的(uggghhh)。提前谢谢

如果我理解得很好,您需要一个“节点”对象的表示:

1) 允许您存储值,以便以后可以搜索正确的节点

2) 使用预定义的数据结构保存图形的信息

3) 允许被搜索算法使用

有一个简单的解决方案可以满足所有三个需求:

public class Node {

    // Add as many fields as you need to contain the node info
    private String mName;
    private int mArbitraryValue;

    // Store the adjacent nodes in a list
    private List<Node> mAdjacencyList;

    //Define your constructors
    public Node(String name, int arbitraryValue, List<Node> adjacencyList) {
        mName = name;
        mArbitraryValue = arbitraryValue;
        mAdjacencyList = adjacencyList;
    }

    /* Add your methods here depending on the functionality that
       you want to implement
    */

    public String getName() {
        return mName;
    }

    public int getArbitraryValue() {
        return mArbitraryValue;
    }

    public List<Node> getNeighbors() {
        return Collections.unmodifiableList(mAdjacencyList);
    }

    // Add setters if you want these values to be able to change

    public boolean addNeighbor(Node n) {
        return !mAdjacencyList.contains((Node) n) && mAdjacencyList.add(n);
    }

    public boolean removeNeighbor(Node n) {
        return mAdjacencyList.remove((Node) n);
    }
}
公共类节点{
//添加包含节点信息所需的尽可能多的字段
私有字符串mName;
私有int-mArbitraryValue;
//将相邻节点存储在列表中
私人名单;
//定义构造函数
公共节点(字符串名称、int-arbitraryValue、列表邻接列表){
mName=名称;
mArbitraryValue=任意值;
MadjacyList=邻接列表;
}
/*根据所使用的功能在此处添加方法
你想实现吗
*/
公共字符串getName(){
返回mName;
}
public int getArbitraryValue(){
返回mArbitraryValue;
}
公共列表getneights(){
返回集合。不可修改列表(MadjacyList);
}
//如果希望这些值能够更改,请添加setter
公共布尔addNeighbor(节点n){
return!madjacyList.contains((节点)n)&&madjacyList.add(n);
}
公共布尔removeNeighbor(节点n){
返回madjacyList.remove((节点)n);
}
}
如果可以更改对象,我不建议您使用HashMap实现邻接列表,因为它可能会导致集合中断(即调用contains()可以返回false,即使对象存在)


现在,您的搜索算法可以访问节点的成员变量,以检查它们是否已完成。

这并不是很多<代码>类节点{private List neights;}。的可能重复项