我需要翻转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错误。事后看来,我不清楚该代码是否意图翻转索引或反转它。由于数学不是我的强项,我试图用单独的数组解决它。
答案 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(高度*宽度)中的所有行。