在 Java 中创建不同边缘时链接网格图块的有效方法

Efficient way of linking grid tiles while creating distinct edges in Java

有一个网格

static Double [][] myTiles = new Double[row][column];

目标连接 每个方块与相邻的方块。 比较对之间的值,构造块之间的link以创建最小生成树 对于给定的网格。

以下是我对这个问题的初步处理

确定了九 ( 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));}

以上逻辑至少创建两个link,最多四个。 在构建最小生成树时,有很多重复项需要排序。

是否有 eloquent 表示上述 if-else 块的方法?

这个要简单得多:

if(row > 0) {
    // north
}
if(row < height) {
    // south
}
if(column > 0) {
    // west
}
if(column < width) {
    // east
}

显然,这假设您至少有一个 2x2 网格。

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

最有效的方法是限制每个图块创建的 link 数量。

为了减少逻辑产生的重复,避免嵌套循环解决方案,而是实施两个单独的 for 循环.

第一步:逐列遍历每个图块每行,然后做一个 link 向东 或向左,直到检测到 边缘 。当检测到边缘时,跳过指针一行向下

第二步:逐行遍历每个图块每列并向 link 或向下移动,直到检测到 边缘 。当检测到边缘时,跳过指针一列

此逻辑涵盖所有图块,防止 IndexOutOfBoundsChecks,并减少创建的重复 link 数量。

        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