如何像正弦波一样遍历数组?

时间:2016-04-11 02:54:33

标签: java arrays multidimensional-array

假设我有一个2D整数数组,mxn。 我想像正弦波一样遍历这个数组。

具体来说,遍历将从最后一行开始,第一列移动到第一行和第二列,移动到最后一行和第三列。

我附上了一张图片,以便进一步阐述。

Sine-wave traversal

T: 我只知道如何按顺序遍历,但我正在考虑转换列,在每一轮更改列的起始索引,但我无法创建一个组合循环来执行此操作。

我的尝试:

boolean startsAtbottom=true;
    //cols become rows, startPoint alternates
    for(int i = 0;i<n;i++)
    {
        if(startsAtbottom)
        {
            for(int j =m-1;j>-1;j--)
            {
                System.out.print(myArr[j][i]);
            }
            startsAtbottom=false;
        }
        else
        {
            for(int j =0;j<m;j++)
            {
                System.out.print(myArr[j][i]);
            }
            startsAtbottom=true;
        }
    }

2 个答案:

答案 0 :(得分:0)

您的解决方案有效,而且没有任何问题。但是你可以通过这样做摆脱if

for (int i = 0; i < n; i++) {
    boolean goingUp = i % 2 == 0;
    for (int j = 0; j < m; j++) {
        int row = goingUp ? m - 1 - j : j;
        System.out.println(myArr[row][i]);
    }
}

答案 1 :(得分:0)

从您的输入开始,您有:

  • 外部循环索引仅从0
  • 递增
  • 偶数列的内循环索引递增和奇数列的递减
  • 你可以通过检查模数是否为0来确定数字是偶数还是奇数(或通过检查是否(i & 0x01) == 0但是那不相关)

鉴于此,很容易对该模式进行建模:

for (int i = 0; i < rows; ++i) {
  for (int j = 0; j < cols; ++j) {
    int value = data[i][i % 2 == 0 ? (cols - j - 1) : j]
  }
}

公式cols - j - 1允许您从结尾开始并向后退(请j = 0 cols - 1 j = cols - 1cols - (cols - 1) - 1 == 0 Aggregate exec() )。

请注意,Java既不是专业也不是专业,因为二维数组只是一个数组数组,因此根据您的实际布局,您可能需要交换索引。