Java 如何创建邻域数组列表来协调无向图中的节点?
给定一个二维数组矩阵,目标是定位所有相邻的坐标,将它们实例化为对象,并将它们添加到ArrayList中供以后使用。我遇到的问题是,在边缘情况下,邻域可能超出矩阵边界。那么,在Java中声明2d数组的边界以便它可能被条件语句捕获的最佳方法是什么 尝试了以下方法。不确定如何解释其中一个邻居超出矩阵边界的情况(例如,只有两个邻居的角节点) 最终的ArrayList应输出以下内容: 当前节点=(1,0),其中值等于7 邻域数组列表等于=Java 如何创建邻域数组列表来协调无向图中的节点?,java,matrix,arraylist,graph,Java,Matrix,Arraylist,Graph,给定一个二维数组矩阵,目标是定位所有相邻的坐标,将它们实例化为对象,并将它们添加到ArrayList中供以后使用。我遇到的问题是,在边缘情况下,邻域可能超出矩阵边界。那么,在Java中声明2d数组的边界以便它可能被条件语句捕获的最佳方法是什么 尝试了以下方法。不确定如何解释其中一个邻居超出矩阵边界的情况(例如,只有两个邻居的角节点) 最终的ArrayList应输出以下内容: 当前节点=(1,0),其中值等于7 邻域数组列表等于={(0,0)、(1,1)、(2,0)},其中值分别等于0、1、0。对
{(0,0)、(1,1)、(2,0)}
,其中值分别等于0、1、0。对于大小为NxM的二维矩阵中的给定(x,y),需要向上(x,y-1)、向下(x,y+1)、左(x-1,y)、右(x+1,y)邻域
可以使用下面的签名定义一个检查数组边界的简单函数
矩阵中的任何单元都是由其两个坐标定义的,仅一个坐标是不够的,因此需要检查相邻单元的两个坐标,以得出其在数组边界内的结论
布尔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,则添加到列表中,否则忽略它
我还建议您在类节点中保留值
注意:当您试图获得与相同的内容非常相似的内容时,您可以参考邻接列表。我想您要做的是与已传递的数组的大小进行比较:
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));
if(nodeX>0)
add(新节点(nodeX-1,nodeY));
if(nodeX0)
添加(新节点(nodeX,nodeY-1));
if(nodeY
道歉。修复了一些用于编译的元素。一个警告是,这仍然不会编译,因为在条件语句中有一些注释,我想从中获得一些智慧。作为一个新手,这仅仅是为了尽可能最好地解决我的问题,而只是一个高层次的实现想法。甚至不确定如何生成此函数,但仅使其编码清晰。这似乎是可行的,当添加到我的示例中时,它会根据所检查节点的位置生成适当数量的相邻节点。快速提问,关于将自定义类对象的ArrayList转换为字符串之一以进行打印,是否已经存在Stackoverflow问题?只需为类创建一个toString
方法并打印列表-它将自动将每个对象转换为其等效字符串。
0, 0, 0
7, 1, 0
0, 7, 0
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));