在 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
有一个网格。
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