【问题标题】:Adding node items to Java Graph with for loop使用 for 循环将节点项添加到 Java Graph
【发布时间】:2012-12-10 14:22:13
【问题描述】:

我正在尝试将新创建的对象添加到网格和图形中。具体来说,如何使用 for 循环有效地将节点添加到图中。它们的网格被设置为双数组,以更新初始视图。 (对象网格是模型并通过推送更新视图)。我还使用 for 循环中 i 和 j 中的项目设置了一个 HashMap 以定义对象的键。但是,为了建立一个图形以便以后计算从节点到节点的最短路径,我需要将这些节点添加到图形中。我想使用 Djikstra 的算法来计算最短路径。我可以创建一个条件语句来定义网格中的角节点和边节点是什么,并定义哪些项目将具有双向边,但这似乎是一个“长切”。有什么方法可以将节点添加到具有预先确定的矩阵大小的图形中,例如 20 X 20,类似于双精度数组?

以下是关于我如何创建前两项(创建双精度数组和 HashMap)的构造函数代码:

// **Constructor
// Construct a new Grid object. Sets up a HashMap of square object in order efficiently to get 
// and add Square objects later.
public ObjectGrid(Integer width, Integer height) 
{
    // View
    gui = new GUI();        // Instantiate GUI
    boardView = new BoardView(width,height);        // Instantiate BoardView

    // Initialize Gui, set time and add simulation event listener to model (ObjectGrid)
    gui.initGUI(BoardView);
    gui.addSimulationEventListener(this);

    // Initialize turnInSteps variable count to 0
    turnInSteps = 0;

    // Initialize numberOfDays variable count to 0
    numberOfDays = 1;

    // Instantiate HashMap
    objectHashMap = new HashMap();

    // Declare new object grid using double array of type objects.
    // Size determined by parameter Integer values in constructor
    myObjectGrid = new ObjectType[width][height];

    // Instantiate Graph object
    Graph graph = new ListGraph();

    // For loop sets up the initial grid with ObejctType using a double array. After
    // the completion of this loop, the grid will have XXX objects in the grid
    // each with a reference to an object. Objects are also added 
    // to HashMap using coordinates as keys and square objects as values.
    for(int i = 0; i < width; i++) 
    {  
        // Iterate through rows
        for(int j = 0; j < height; j++) 
        {  
            // Iterate through columns
            myObjectGrid[i][j] = new ObjectType();  // Instantiate a new Square at each row/column using default constructor
            gridView.addObjectView(myObjectGrid[i][j].getObjectView(), i, j);  // Add object view to each row/column placement
            String hashMapKey = (i + ", " + j); // Use values from i and j as Key for objects HashMap
            myObjectGrid[i][j].setID(hashMapKey);  // Add ID's for each ObjectView to display in object using values from i and j
            objectHashMap.add(hashMapKey, myObjectGrid[i][j]);  // Add object to HashMap using string value of coordinates as key
            listGraph.add(myObjectGrid[i][j]);

            // Pseudo code
            if (i != (width-height) && (j != height) etc) 
            {
                listGraph.addBidirectionalEdge(mySquareGrid[i][j], (mySquareGrid[i][j+1]), 1);
                listGraph.addBidirectionalEdge(mySquareGrid[i][j], (mySquareGrid[i+1][j]), 1);
                listGraph.addBidirectionalEdge(mySquareGrid[i][j], (mySquareGrid[i+1][j+1]), 1);
            }
        }
    }
}

【问题讨论】:

  • 你的问题是什么?
  • 抱歉没有具体说明。 (本网站上的第一篇文章)。问题是如何使用 for 循环将对象作为节点添加到图中。如果 for 循环不是正确的方法,那么对另一种方法的指导会有所帮助。通过单元测试,我在图中的顶点返回 null。
  • 最好用这个问题更新你的帖子。
  • 嗨,根据 tcb 的建议编辑了问题。

标签: java graph edges


【解决方案1】:

通过单元测试,我在图中的顶点返回 null。

原因是以下几行:

listGraph.addBidirectionalEdge(mySquareGrid[i][j], (mySquareGrid[i][j+1]), 1);
listGraph.addBidirectionalEdge(mySquareGrid[i][j], (mySquareGrid[i+1][j]), 1);
listGraph.addBidirectionalEdge(mySquareGrid[i][j], (mySquareGrid[i+1][j+1]), 1);

您正在初始化mySquareGrid 并使用未来的节点创建边。这些带有j+1i+1 的节点此时为空。

尝试最简单的解决方案 - 在网格初始化之后,通过网格执行相同的循环并创建图形的边缘。

另外,您可以尝试将其更改为以下内容:

listGraph.addBidirectionalEdge(mySquareGrid[i][j-1], (mySquareGrid[i][j]), 1);
listGraph.addBidirectionalEdge(mySquareGrid[i-1][j], (mySquareGrid[i][j]), 1);
listGraph.addBidirectionalEdge(mySquareGrid[i-1][j-1], (mySquareGrid[i][j]), 1);

【讨论】:

  • 假设顶点为 4,4(分别为 x 和 y):[i][j-1] 4,3,与 4,4(北)相邻。 [i-1][j] 3,4,毗邻 4,4(西)。 [i-1][j-1] 3,3,与 4,4 相邻(西北)。但是,[i-1][j-1] 到 [i][j+1] 是 3,3 到 4,5,它们并不相邻。非相邻节点之间是否允许边?
  • 我添加了条件语句,以便能够识别角对象和边框对象,然后使用条件分支语句确定哪些对象是相邻的:'for (int i=0; i
  • 这真的取决于你选择的算法。试着看看myObjectGrid。它是否为您提供有关相邻节点的信息?如果是,那么您可以只使用此网格构建搜索算法,您不需要构建图形。
猜你喜欢
  • 1970-01-01
  • 2014-04-17
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
相关资源
最近更新 更多