如何翻转表示Java中的2D数组的1D short / int数组中的行

时间:2013-05-13 18:06:17

标签: java arrays flip

我需要翻转1-D 64元素的短裤数组(如果它更容易,我可以切换到整数,但我认为相同的过程也适用于它)在Java上。为了便于理解,我在这里将其表示为方形表,因为实际问题出现在棋盘上。

例如:

short[] example = new short[]
{
    1, 2, 3,
    4, 5, 6,
    7, 8, 9
};

会变成:

7 8 9
4 5 6
1 2 3

请注意, NOT 与反转数组相同(每个回答我发现的类似问题都会犯这个错误,因此我不得不问!)。反转数组会给出:

9 8 7
6 5 4
3 2 1

如果我错过了任何重要信息,请致歉,我们非常感谢您的帮助!

编辑:数组是1D并包含64个元素,因此很短[64],反转数组与原始数组分开。就我所尝试的而言,我只是在努力绕过它。我知道如何反转数组,但这不是我所追求的,我原本试图使用反转索引:

byte index = (byte)(((byte)(position + 56)) - (byte)((byte)(position / 8) * 16));

这是我在Chessbin上找到的代码段,但这会返回错误的值并导致IndexOutOfBounds错误。事后看来,我不清楚该代码是否意图翻转索引或反转它。由于数学不是我的强项,我试图用单独的数组解决它。

2 个答案:

答案 0 :(得分:2)

我的提议是这样的:

public class Flipper {

    public short[] flip(short[] array, int columns) {
        short[] flipped = new short[array.length];
        for(int i=0;i<array.length;i++){
            int row = (i/columns); //use the fact that integer/integer is rounded down
            int column = (i%columns);
            flipped[i] = array[array.length-((columns*(row+1))-column)];
        }
        return flipped;
    }

}

可以测试:

public class FlipperTest {

    private Flipper flipper = new Flipper();

    @Test
    public void test() {
        short[] array = new short[]{1,2,3,4,5,6,7,8,9};
        short[] actualResult = flipper.flip(array, 3);
        assertThat(actualResult, equalTo(new short[]{7,8,9,4,5,6,1,2,3}));
    }

}

希望代码不言自明

答案 1 :(得分:0)

您有一个表示逻辑2D数组的物理1D数组,并且您想要交换行。您可以通过将2D数组索引映射到一维数组索引来实现此目的。

height为行数,width为列数。

for ( int i = 0; i < height/2; ++i ) {
    int k = height - 1 - i;
    for ( int j = 0; j < width; ++j ) {
        short temp = array[i * width + j];
        array[i * width + j] = array[k * width + j];
        array[k * width + j] = temp;
    }
}    

为了便于阅读,我写了这篇文章。您或编译器可以优化一些重复计算。

您可以通过使用2D数组进一步优化,这将允许您将引用交换为O(高度)中的行,而不是复制O(高度*宽度)中的所有行。