【问题标题】:How to flip rows in a 1D short/int array representing a 2D array in Java如何在Java中表示二维数组的一维短/整数数组中翻转行
【发布时间】:2013-05-07 20:38:35
【问题描述】:

我需要翻转一个一维 64 元素的短裤数组(如果它更容易,我可以切换到整数,但我假设相同的过程适用于任何一个)在 Java 中的头部。为了便于理解,我在这里将它表示为一个方桌,因为实际的问题是在棋盘上。

例如:

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

抱歉,如果我错过了任何重要信息,我们将不胜感激!

编辑:数组是一维的,包含 64 个元素,所以很短 [64],并且反转的数组与原始数组是分开的。就我所尝试的而言,我只是在努力解决它。我知道如何反转数组,但这不是我想要的,我最初尝试使用以下方法反转索引:

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

这是我在Chessbin 上找到的代码 sn-p,但这会返回不正确的值并给出 IndexOutOfBounds 错误。事后看来,我不清楚该代码是否旨在翻转索引或反转它。由于数学不是我的强项,因此我尝试使用单独的数组来解决它。

【问题讨论】:

  • 你错过了你尝试过的东西
  • 这个数组在代码中是什么样子的?是short[][]吗?你有没有尝试过什么?有错误吗?
  • 这是一个多维数组吗?
  • 这是一个二维数组吗?否则我不知道你怎么知道从哪里开始 flipping 数组...
  • 为什么不使用多维数组呢?你怎么知道应该有多少“行”(我知道可能是 8,但总是这样)?

标签: java arrays flip


【解决方案1】:

我的建议是这样的:

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 开始的,“列”是从 0 开始的;这值得在代码中提及,最好是在变量名中,或者至少是内联文档中。
  • @Andy Thomas-Cramer - 同意,答案改进
【解决方案2】:

您有一个表示逻辑二维数组的物理一维数组,并且您想要交换行。您可以通过将 2D 数组索引映射到 1D 数组索引来部分地做到这一点。

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(height) 中行的引用,而不是复制 O(height * width) 中的所有行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多