使用ArrayLists在Java中创建图形

时间:2014-01-14 06:09:12

标签: java graph arraylist

我是Java新手,我想通过创建图表来练习。我在创建图表时遇到问题,因为我不确定如何正确地执行此操作。我缺乏逻辑,而且Java的新功能让事情变得非常困难。我想知道是否有人可以帮助我或引导我走正确的道路!谢谢!

基本上我试图用图形创建这样的东西。节点将包含ArrayList的邻居。

    A,B,C,D
A = 0,1,3,0
B = 1,0,0,2
C = 1,0,0,3   //shorter path to A (cycle)
D = 0,0,3,0

节点使用或不使用权重(如果我将数字更改为1)相互连接

这是我到目前为止(它不完整):

public class GraphNode {
    boolean visited;


    public GraphNode() {
        List<GraphNode> node = new ArrayList<GraphNode>();  // store neighbors
        this.visited = false;

    }

    public void addNeighbor(GraphNode root, GraphNode target, int distance) {
        root.add(target);     // cannot use "add" to ArrayList

    }
}

1 个答案:

答案 0 :(得分:3)

为了能够从相同的类中的accross方法访问ArrayList,您需要将该局部变量提升为全局变量(字段),如下所示:

public class GraphNode {
    /*Global Variables*/
    boolean visited;
    List<GraphNode> nodeNeighbours;
    /*Global Variables*/

    public GraphNode() {
        this.nodeNeighbours = new ArrayList<GraphNode>();  // store neighbors
        this.visited = false;

    }

    public void addNeighbor(GraphNode target) {
        this.nodeNeighbours.add(target);    //This will add target to the neighbours of this given node.
    }
}

编辑:
最短路径算法(就内存服务而言)具有固定的起始点,这意味着根将始终相同。同样可以说是它们的重量,通常不会改变。

但是,随着探索不同的路径,到根节点的距离最有可能发生变化。考虑到这一点,你可以按如下方式重写你的课程:

public class GraphNode {
    /*Global Variables*/
    protected double weight;
    protected double distanceFromRoot;
    protected List<GraphNode> neighbours;
    protected boolean visited;
    /*Global Variables*/

    public GraphNode(double weight, double distanceFromRoot) {
        this.weight = weight;
        this.distanceFromRoot = distanceFromRoot;
        this.neighbours = new ArrayList<GraphNode>();
        this.visited = false;
    }

    public void setDistanceFromRoot(double distanceFromRoot) {
         this.distanceFromRoot = distanceFromRoot;
    }

    public void setVisited(boolean visited) {
         this.visited = visited;
    }

    public double getWeight() {
        return this.weight;
    }

    public double getDistanceFromRoot() {
        return this.distanceFromRoot;
    }

    public List<GraphNode> getNeighbours() {
        return this.neighbours;
    }   

    public void addNeighbour(GraphNode neighbour) {
        this.neighbours.add(neighbour)
    }
}

这可能比你开始时更广泛。代码中的主要变化是此代码提升了封装。封装是OOP的核心基础之一,您基本上拒绝直接访问全局变量。访问权限通过适当的setget方法提供,您可以使用该方法来定义程序外部人员修改程序内部状态的方式和时间。