在Java中创建不同边的同时链接网格分幅的有效方法

在Java中创建不同边的同时链接网格分幅的有效方法,java,multidimensional-array,grid,row,Java,Multidimensional Array,Grid,Row,有一个网格 static Double [][] myTiles = new Double[row][column]; 目标是将每个磁贴与相邻磁贴连接起来比较两个图块之间的值,在图块之间构建链接,为给定网格创建最小生成树 以下是我对这个问题的初步看法: 确定了九(9)组瓷砖 这些组具有相同的逻辑和相邻方块的相同可用性 对于网格中的每个单元格,我决定检查上面、下面、左边和右边的一个单元格。 某些单元格位于网格的边缘时无法执行所有检查。下面是每种类型的平铺的移动表示 我当前的解决方案是一个嵌套

有一个网格

static Double [][] myTiles = new Double[row][column];
目标是将每个磁贴与相邻磁贴连接起来比较两个图块之间的值,在图块之间构建链接,为给定网格创建最小生成树

以下是我对这个问题的初步看法:

确定了九(9)组瓷砖

这些组具有相同的逻辑和相邻方块的相同可用性

对于网格中的每个单元格,我决定检查上面、下面、左边和右边的一个单元格。 某些单元格位于网格的边缘时无法执行所有检查。下面是每种类型的平铺的移动表示

我当前的解决方案是一个嵌套的for循环,带有下面的if-else语句:

            if ( row == 0 && column == 0)   {
                mySortingQueue.offer(createEdgeSouth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeEast(myEdge, myTiles, row, column));     }
            
            else if ( row == 0 && ( column > 0 && column < myTiles.length ) )   {
                mySortingQueue.offer(createEdgeSouth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeEast(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeWest(myEdge, myTiles, row, column));     }
            
            else if ( row == 0 && column == myTiles.length )    {
                mySortingQueue.offer(createEdgeSouth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeWest(myEdge, myTiles, row, column));     }
            
            else if ( ( row > 0 && row < myTilese[row].length ) && column == 0 )    {
                mySortingQueue.offer(createEdgeSouth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeEast(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeNorth(myEdge, myTiles, row, column));    }
            
            else if ( row == myTilese[row].length && column == 0 )  {
                mySortingQueue.offer(createEdgeEast(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeNorth(myEdge, myTiles, row, column));    }
            
            else if ( row == myTilese[row].length && ( column > 0 && column < myTiles.length ) )    {
                mySortingQueue.offer(createEdgeNorth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeEast(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeWest(myEdge, myTiles, row, column));     }
            
            else if ( row == myTilese[row].length &&  column == myTiles.length )    {
                mySortingQueue.offer(createEdgeNorth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeWest(myEdge, myTiles, row, column));     }
            
            else if ( ( row > 0 &&  row < myTilese[row].length ) && column == myTiles.length )  {
                mySortingQueue.offer(createEdgeNorth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeWest(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeSouth(myEdge, myTiles, row, column));}
            
            else    {
                mySortingQueue.offer(createEdgeNorth(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeEast(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeWest(myEdge, myTiles, row, column));
                mySortingQueue.offer(createEdgeSouth(myEdge, myTiles, row, column));}
if(行==0&&column==0){
offer(CreateEdgeOuth(myEdge、myTiles、行、列));
提供(createEdgeEast(myEdge,myTiles,行,列));}
else if(行==0&(列>0&&column0&&row0&&column0&&row
上述逻辑创建了至少两个链接,最多四个链接。 当涉及到构建最小生成树时,有很多问题需要解决

是否有一种雄辩的方式来表示上述if-else块?

这要简单得多:

if(行>0){
//北
}
如果(行<高度){
//南方
}
如果(列>0){
//西部
}
如果(列<宽度){
//东边
}
显然,这假设您至少有一个2x2网格


我认为您考虑过了您的实现,但是您发布的代码可以很容易地进行重构以生成一个好的测试用例。

最有效的方法是限制每个互动程序创建的链接数量

为了使逻辑产生更少的重复项,避开嵌套循环解决方案,并为循环
实现两个独立的,这是很有帮助的

static Double [][] myTiles = new Double[row][column];
第一步:逐列逐行遍历每一个磁贴,并向东或向左链接,直到检测到边缘。检测到边缘时,将指针向下跳过一行

第二步:逐行遍历每列的每个磁贴,并向南或向下链接一个链接,直到检测到边缘。检测到边缘时,将指针向右跳过一列

此逻辑覆盖所有分幅,防止索引自动边界检查,并减少创建的重复链接量

        for ( tileColumn = 0; tileColumn < 74; tileColumn ++ )  {
            myEdge = new GraphEdge<String>();
            
            mySortingQueue.offer(createEdgeEast(myEdge, myTiles, tileRow, tileColumn));
            
            if ( tileColumn == 73 && tileRow < 34 ) {   
                tileColumn = 0;
                tileRow++;  }
        }   /*  End of the column for loop  */
        
        tileRow = ZERO;
        tileColumn = ZERO;
        
        for ( tileRow = 0; tileRow < 34; tileRow++ )    {
            myEdge = new GraphEdge<String>();
            mySortingQueue.offer(createEdgeSouth(myEdge, myTiles, tileRow, tileColumn));
            
            if ( tileRow == 33 && tileColumn < 74)  {   
                tileRow = 0;
                tileColumn++;   }
        }   // End of the row for loop
for(tileColumn=0;tileColumn<74;tileColumn++){
myEdge=新的GraphEdge();
offer(createEdgeEast(myEdge、myTiles、tileRow、tileColumn));
如果(tileColumn==73&&tileRow<34){
tileColumn=0;
tileRow++;}
}/*循环列的末尾*/
tileRow=零;
tileColumn=零;
对于(tileRow=0;tileRow<34;tileRow++){
myEdge=新的GraphEdge();
提供(CreateEdgeOuth(myEdge、myTiles、tileRow、tileColumn));
如果(tileRow==33&&tileColumn<74){
tileRow=0;