2013-05-13 39 views
-3

我需要翻转一个一维64个元素的短裤数组(如果它更简单,我可以切换为整数,但我假定使用相同的过程将可以用于Java)。为了便于理解,我在此将其表示为方桌,因为实际问题在棋盘上。如何翻转代表Java中二维数组的一维short/int数组中的行

例如:

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

将成为:

7 8 9 
4 5 6 
1 2 3 

请注意,这是一样的倒车,我发现已经使此阵列(每个回答者到类似的问题错误,因此我不得不问!)。扭转阵列将给:

9 8 7 
6 5 4 
3 2 1 

道歉,如果我错过了任何重要的信息,任何帮助表示赞赏!

编辑:该数组是1D,并包含64个元素,如此短[64],而反向阵列是独立于原来的。至于我所尝试的,我只是在努力围绕它而努力。我知道如何扭转阵列,但是这不是我后,我原本试图扭转使用索引:这是一段代码我在Chessbin发现

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

,但是这将返回不正确的值并给出IndexOutOfBounds错误。事后看来,我不清楚这些代码是为了翻转索引还是反转索引。由于数学不是我的强项,我试图用单独的数组解决它。

+12

你已经错过了你已经尝试 – 2013-05-13 18:07:02

+3

这个数组在代码中看起来像什么?它是否短[] []'?你有没有尝试过任何东西?有错误吗? – thegrinner 2013-05-13 18:08:26

+1

这是一个多维数组 ? – Adarsh 2013-05-13 18:09:52

回答

0

你有一个物理的一维数组表示一个逻辑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; 
    } 
}  

我已经写了这个可读性。您或编译器可能会优化一些重复的计算。

您可能能够通过使用二维数组,这样可以让你交换引用行的O(高度)进一步优化,而不是为O复制所有行(高*宽)。

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

对于单循环解决方案+1。不在位,但可以很容易地在原地进行。我的可读性较差。注意:“行”是基于1的,而“列”是基于0的;在代码中值得一提,最好是变量名,或者至少是在线文档。 – 2013-05-13 19:34:32

+0

@Andy Thomas-Cramer - 同意,回答改善 – macias 2013-05-13 19:51:09