JAVA-如何在没有for循环的情况下遍历2D数组?

时间:2020-04-05 23:12:48

标签: java arrays for-loop multidimensional-array nested-loops

我正在尝试使用已提供的测试文件来构建寻宝游戏。这些文本文件具有字符S,W,E,N和T,它们都与除T(宝藏)以外的所有方向相对应。一切正常,直到移动了行/列的长度。我怀疑它与for循环有关,但我不确定。 有没有没有for循环的方法,或者没有人有任何建议让它回到正轨吗?

这是到目前为止我的更新代码:

library(data.table)
nr <- 1e7L
ng <- nr/4L
set.seed(0L)
DT <- data.table(Subject=sample(ng, nr, TRUE), pt=1:nr)#rnorm(nr))
DT2 <- copy(DT)


microbenchmark::microbenchmark(times=3L,
    mtd0 = {a0 <- DT[DT[, .I[which.max(pt)], by=Subject]$V1]},
    mtd1 = {a1 <- DT[DT[order(-pt), .I[1L], Subject]$V1]},
    mtd2 = {a2 <- DT2[DT2[, rn := .I][
        order(Subject, -pt), rn[c(TRUE, diff(Subject)>0L)]
    ]]},
    mtd3 = {a3 <- unique(DT[order(Subject, -pt)], by="Subject")}
)
fsetequal(a0[order(Subject)], a1[order(Subject)])
#[1] TRUE
fsetequal(a0[order(Subject)], a2[, rn := NULL][order(Subject)])
#[1] TRUE
fsetequal(a0[order(Subject)], a3[order(Subject)])
#[1] TRUE

这也是测试文件的示例。

Unit: seconds
 expr      min       lq     mean   median       uq      max neval
 mtd0 3.256322 3.335412 3.371439 3.414502 3.428998 3.443493     3
 mtd1 1.733162 1.748538 1.786033 1.763915 1.812468 1.861022     3
 mtd2 1.136307 1.159606 1.207009 1.182905 1.242359 1.301814     3
 mtd3 1.123064 1.166161 1.228058 1.209257 1.280554 1.351851     3

这个应该返回3,这是移动的次数(在我的代码中是转数),但是相反,它到达W(需要2个移动)并返回-2,这仅用于当它移动到更多位置时不止一次。此外,并非所有的阵列都是正方形,例如一些是1x200或4x5。 我将不胜感激!

1 个答案:

答案 0 :(得分:0)

如果您知道木板是这样的,那么从(0,0)开始,您就不会陷入循环中或离开木板,您可以使用类似以下的方法:

public int playGame()
{
  int numMoves = 0; 
  int currentRow = 0;
  int currentCol = 0;

  while(gameBoard[currentRow][currentCol] != 'T')
  {
    switch (gameBoard[currentRow][currentCol])
    {
    case 'E': currentCol++; break;
    case 'W': currentCol--; break;
    case 'S': currentRow--; break;
    case 'N': currentRow++; break;
    default:
       throw new IllegalStateException("Unrecognized Move");
    }
    numMoves++;             
  }

  return numMoves;
}

您可能要使用if-then-else而不是switch

如果您需要检查循环或车外运动,则应该可以添加这些检查。