Warm tip: This article is reproduced from serverfault.com, please click

multidimensional array-在Java中创建独特边缘时链接网格图块的有效方法

(multidimensional array - Efficient way of linking grid tiles while creating distinct edges in Java)

发布于 2020-12-04 17:42:28

有一个网格

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

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

以下是我针对此问题的初步方法

识别出九(9)组瓷砖。

这是一张分成9个不同区域的单元格网格的图片。

这些组具有相同的逻辑,并且相邻正方形的可用性相同。

对于我网格中的每个单元格,我决定在上方下方左侧右侧检查一个单元格当某些细胞不能执行所有检查位于边缘的网格。下面是每种图块的运动表示。

一个网格,其中包含每个图块的移动可用性。

我当前的解决方案是使用以下if-else语句嵌套for循环

            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-else块?

Questioner
Ivan
Viewed
0
Ivan 2020-12-08 15:50:03

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

为了使逻辑产生更少的重复,逃避嵌套循环解决方案,而是实现两个单独的 for循环是有帮助的

第一步:逐行遍历每一行的每个图块向东或向左建立一个链接,直到检测到边缘当检测到边缘,跳过指针一行向下

第二步:逐行遍历每一列的每个图块向南或向下建立一个链接,直到检测到边缘当检测到边缘时,将指针向右一列

分割的网格,其中包含连接行和列的链接的痕迹。

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

        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