如何在无向图中创建邻居的ArrayList以协调节点?

时间:2019-09-17 03:36:38

标签: java matrix arraylist graph

给出2D数组矩阵,目标是找到所有相邻坐标,将它们实例化为对象,并将它们添加到ArrayList中以备后用。我遇到的问题是考虑到邻居可能不在矩阵范围内的极端情况。这样,在Java中确定2d数组的边界以便可能被条件语句捕获的最佳方法是什么?

尝试以下方法。不确定如何解决其中一个邻居超出矩阵范围的情况(例如,只有两个邻居的角节点)。


import java.util.ArrayList;

class Node{

    private int nodeX;
    private int nodeY;

    public Node(int enterX, int enterY){
        nodeX = enterX;
        nodeY = enterY;
    }



    public ArrayList<Node> getNeighbors(int[][] enterGraph){

        ArrayList<Node> adjacentNodes = new ArrayList<>();


        if(this.nodeX + 1 > /*Farthest value right in row*/){
             Node right = new Node(this.nodeX + 1, this.nodeY);
             adjacentNodes.add(right);
        }
        if(this.nodeX - 1 < /*Farthest value left in row*/){
             Node left = new Node(this.nodeX - 1, this.nodeY);
             adjacentNodes.add(left);
        }
        if(this.nodeY + 1 < /*Farthest value up in row*/){
             Node up = new Node(this.nodeX, this.nodeY + 1);
             adjacentNodes.add(up);
        }

        if(this.nodeY - 1 < /*Farthest value down in row*/){
             Node down = new Node(this.nodeX, this.nodeY - 1);
             adjacentNodes.add(down);
        }


        return adjacentNodes;
    }

}

例如,采用以下矩阵:

0, 0, 0
7, 1, 0
0, 7, 0 

最终的ArrayList应该输出以下内容:

当前节点=(1,0),其中值等于7。

邻居的ArrayList等于= {(0,0), (1,1), (2,0)},其中值分别等于0、1、0。

2 个答案:

答案 0 :(得分:1)

对于大小为NxM的2D矩阵中的给定(x,y),您需要UP(x,y-1),DOWN(x,y + 1),LEFT(x-1,y),RIGHT( x + 1,y)邻居。

可以使用下面的签名定义一个简单的检查数组边界的函数。

矩阵中的任何一个单元格都由其两个坐标定义,仅一个是不够的,因此您需要检查邻居的两个坐标才能得出结论,认为它在数组范围内。

boolean isSafe(int x, int y, int N, int M)

isSafe将检查x,y是否在数组范围内,同时检查上限(N,M)和下限(0)。您可以轻松实现此功能(如果x或y中的任何一个超出范围,则返回false。如果没有一个超出范围,则返回true)

现在对于给定的(x,y),使用函数isSafe检查邻居的坐标,例如使其(x,y-1)向上,如果返回true,则将其添加到列表中否则忽略它。

我还建议您将值保留在Node类中。

P.S:您可以参考邻接列表,因为您正试图获得与相同产品非常相似的东西(可能不完全相同)

答案 1 :(得分:1)

我怀疑您想要做的是与您传递的数组大小进行比较:

if (nodeX > 0)
    adjacentNodes.add(new Node(nodeX - 1, nodeY));
if (nodeX < enterGraph.length - 1)
    adjacentNodes.add(new Node(nodeX + 1, nodeY));
if (nodeY > 0)
    adjacentNodes.add(new Node(nodeX, nodeY - 1));
if (nodeY < enterGraph[nodeX].length - 1)
    adjacentNodes.add(new Node(nodeX, nodeY + 1));
相关问题